use of de.mirkosertic.bytecoder.ssa.IntegerValue in project Bytecoder by mirkosertic.
the class InlineGotoOptimizerTest method testIf.
@Test
public void testIf() {
Program theProgram = new Program();
ControlFlowGraph theGraph = theProgram.getControlFlowGraph();
RegionNode theNode = theGraph.createAt(BytecodeOpcodeAddress.START_AT_ZERO, RegionNode.BlockType.NORMAL);
RegionNode theNode1 = theGraph.createAt(new BytecodeOpcodeAddress(20), RegionNode.BlockType.NORMAL);
RegionNode theNode2 = theGraph.createAt(new BytecodeOpcodeAddress(40), RegionNode.BlockType.NORMAL);
RegionNode theNode3 = theGraph.createAt(new BytecodeOpcodeAddress(60), RegionNode.BlockType.NORMAL);
theNode.addSuccessor(theNode1);
theNode.addSuccessor(theNode2);
ExpressionList theTrueClause = new ExpressionList();
theTrueClause.add(new GotoExpression(new BytecodeOpcodeAddress(20)));
IFExpression theIF = new IFExpression(new BytecodeOpcodeAddress(0), new BytecodeOpcodeAddress(20), new IntegerValue(10), theTrueClause);
theNode.getExpressions().add(theIF);
theNode.getExpressions().add(new GotoExpression(new BytecodeOpcodeAddress(40)));
theNode1.addSuccessor(theNode3);
theNode1.getExpressions().add(new GotoExpression(new BytecodeOpcodeAddress(60)));
theNode2.addSuccessor(theNode3);
theNode2.getExpressions().add(new GotoExpression(new BytecodeOpcodeAddress(60)));
theNode3.getExpressions().add(new ReturnExpression());
theGraph.calculateReachabilityAndMarkBackEdges();
InlineGotoOptimizer theOptimizer = new InlineGotoOptimizer();
theOptimizer.optimize(theGraph, null);
System.out.println(theGraph.toDOT());
}
use of de.mirkosertic.bytecoder.ssa.IntegerValue in project Bytecoder by mirkosertic.
the class WASMSSAWriter method writeArrayStoreExpression.
private void writeArrayStoreExpression(ArrayStoreExpression aExpression) {
List<Value> theIncomingData = aExpression.incomingDataFlows();
Value theArray = theIncomingData.get(0);
Value theIndex = theIncomingData.get(1);
Value theValue = theIncomingData.get(2);
// If the index is a constant, we can precompute the offset.
if (theIndex instanceof IntegerValue) {
int offset = 20 + ((IntegerValue) theIndex).getIntValue() * 4;
switch(aExpression.getArrayType().resolve()) {
case DOUBLE:
case FLOAT:
{
print("(f32.store ");
break;
}
default:
{
print("(i32.store ");
break;
}
}
print("offset=" + offset + " ");
writeValue(theArray);
print(" ");
writeValue(theValue);
println(")");
return;
}
switch(aExpression.getArrayType().resolve()) {
case DOUBLE:
case FLOAT:
{
println("(f32.store offset=20 ");
break;
}
default:
{
println("(i32.store offset=20 ");
break;
}
}
WASMSSAWriter theChild = withDeeperIndent();
theChild.print("(i32.add ");
theChild.writeValue(theArray);
theChild.print(" (i32.mul ");
theChild.writeValue(theIndex);
theChild.print(" (i32.const 4)");
theChild.println("))");
theChild.writeValue(theValue);
theChild.println();
println(")");
}
use of de.mirkosertic.bytecoder.ssa.IntegerValue in project Bytecoder by mirkosertic.
the class RedundantAssignmentOptimizerTest method testBinaryOptimization.
@Test
public void testBinaryOptimization() {
Program theProgram = new Program();
ControlFlowGraph theGraph = new ControlFlowGraph(theProgram);
RegionNode theStart = theGraph.createAt(BytecodeOpcodeAddress.START_AT_ZERO, RegionNode.BlockType.NORMAL);
ExpressionList theExpressions = theStart.getExpressions();
Variable theVariable1 = new Variable(TypeRef.Native.INT, "var1");
Variable theVariable2 = new Variable(TypeRef.Native.INT, "var2");
IntegerValue theInt1 = new IntegerValue(10);
theVariable1.initializeWith(theInt1);
theExpressions.add(new VariableAssignmentExpression(theVariable1, theInt1));
IntegerValue theInt2 = new IntegerValue(20);
theVariable2.initializeWith(theInt2);
theExpressions.add(new VariableAssignmentExpression(theVariable2, theInt2));
Variable theVariable3 = new Variable(TypeRef.Native.INT, "var3");
BinaryExpression theBinary = new BinaryExpression(TypeRef.Native.INT, theVariable1, BinaryExpression.Operator.ADD, theVariable2);
theVariable3.initializeWith(theBinary);
theExpressions.add(new VariableAssignmentExpression(theVariable3, theBinary));
theExpressions.add(new ReturnValueExpression(theVariable3));
RedundantAssignmentOptimizer theOptimizer = new RedundantAssignmentOptimizer();
theOptimizer.optimize(theGraph, null);
System.out.println(theExpressions);
}
use of de.mirkosertic.bytecoder.ssa.IntegerValue in project Bytecoder by mirkosertic.
the class OpenCLWriter method printValue.
private void printValue(Value aValue) {
if (aValue instanceof Variable) {
Variable theVariable = (Variable) aValue;
print(theVariable.getName());
} else if (aValue instanceof InvokeVirtualMethodExpression) {
printInvokeVirtual((InvokeVirtualMethodExpression) aValue);
} else if (aValue instanceof InvokeStaticMethodExpression) {
printInvokeStatic((InvokeStaticMethodExpression) aValue);
} else if (aValue instanceof GetFieldExpression) {
printGetFieldValue((GetFieldExpression) aValue);
} else if (aValue instanceof ArrayEntryExpression) {
printArrayEntryValue((ArrayEntryExpression) aValue);
} else if (aValue instanceof BinaryExpression) {
printBinaryValue((BinaryExpression) aValue);
} else if (aValue instanceof IntegerValue) {
printIntegerValue((IntegerValue) aValue);
} else if (aValue instanceof LongValue) {
printLongValue((LongValue) aValue);
} else if (aValue instanceof FloatValue) {
printFloatValue((FloatValue) aValue);
} else if (aValue instanceof DoubleValue) {
printDoubleValue((DoubleValue) aValue);
} else if (aValue instanceof TypeConversionExpression) {
printTypeConversionValue((TypeConversionExpression) aValue);
} else if (aValue instanceof CompareExpression) {
printCompareExpression((CompareExpression) aValue);
} else if (aValue instanceof DirectInvokeMethodExpression) {
printDirectInvokeMethodExpression((DirectInvokeMethodExpression) aValue);
} else {
throw new IllegalArgumentException("Not supported : " + aValue);
}
}
Aggregations