diff --git a/src/dk/camelot64/kickc/CompileLog.java b/src/dk/camelot64/kickc/CompileLog.java index 805e27082..02a112573 100644 --- a/src/dk/camelot64/kickc/CompileLog.java +++ b/src/dk/camelot64/kickc/CompileLog.java @@ -12,6 +12,7 @@ public class CompileLog { public void append(String msg) { log.append(msg); log.append("\n"); + //System.out.printf(msg+"\n"); } public StringBuilder getLog() { diff --git a/src/dk/camelot64/kickc/Compiler.java b/src/dk/camelot64/kickc/Compiler.java index 5e994cdc2..9027ab2c1 100644 --- a/src/dk/camelot64/kickc/Compiler.java +++ b/src/dk/camelot64/kickc/Compiler.java @@ -43,113 +43,131 @@ public class Compiler { } } - public CompilationResult compile(final CharStream input) throws IOException { + public CompilationResult compile(final CharStream input) { CompileLog log = new CompileLog(); - log.append(input.toString()); - KickCLexer lexer = new KickCLexer(input); - KickCParser parser = new KickCParser(new CommonTokenStream(lexer)); - parser.setBuildParseTree(true); - parser.addErrorListener(new BaseErrorListener() { - @Override - public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { - throw new RuntimeException("Error parsing file "+input.getSourceName()+"\n - Line: "+line+"\n - Message: "+msg); - } - }); - KickCParser.FileContext file = parser.file(); - Pass1GenerateStatementSequence pass1GenerateStatementSequence = new Pass1GenerateStatementSequence(log); - pass1GenerateStatementSequence.generate(file); - StatementSequence statementSequence = pass1GenerateStatementSequence.getSequence(); - Scope programScope = pass1GenerateStatementSequence.getProgramScope(); - Pass1TypeInference pass1TypeInference = new Pass1TypeInference(); - pass1TypeInference.inferTypes(statementSequence, programScope); + try { + log.append(input.toString()); + KickCLexer lexer = new KickCLexer(input); + KickCParser parser = new KickCParser(new CommonTokenStream(lexer)); + parser.setBuildParseTree(true); + parser.addErrorListener(new BaseErrorListener() { + @Override + public void syntaxError( + Recognizer recognizer, + Object offendingSymbol, + int line, + int charPositionInLine, + String msg, + RecognitionException e) { + throw new RuntimeException("Error parsing file " + input.getSourceName() + "\n - Line: " + line + "\n - Message: " + msg); + } + }); + KickCParser.FileContext file = parser.file(); + Pass1GenerateStatementSequence pass1GenerateStatementSequence = new Pass1GenerateStatementSequence(log); + pass1GenerateStatementSequence.generate(file); + StatementSequence statementSequence = pass1GenerateStatementSequence.getSequence(); + Scope programScope = pass1GenerateStatementSequence.getProgramScope(); + Pass1TypeInference pass1TypeInference = new Pass1TypeInference(); + pass1TypeInference.inferTypes(statementSequence, programScope); - log.append("PROGRAM"); - log.append(statementSequence.toString()); - log.append("SYMBOLS"); - log.append(programScope.getSymbolTableContents()); + log.append("PROGRAM"); + log.append(statementSequence.toString()); + log.append("SYMBOLS"); + log.append(programScope.getSymbolTableContents()); - Pass1GenerateControlFlowGraph pass1GenerateControlFlowGraph = new Pass1GenerateControlFlowGraph(programScope); - ControlFlowGraph controlFlowGraph = pass1GenerateControlFlowGraph.generate(statementSequence); - log.append("INITIAL CONTROL FLOW GRAPH"); - log.append(controlFlowGraph.toString()); + Pass1GenerateControlFlowGraph pass1GenerateControlFlowGraph = new Pass1GenerateControlFlowGraph(programScope); + ControlFlowGraph controlFlowGraph = pass1GenerateControlFlowGraph.generate(statementSequence); + log.append("INITIAL CONTROL FLOW GRAPH"); + log.append(controlFlowGraph.toString()); - Pass1ProcedureCallParameters pass1ProcedureCallParameters = - new Pass1ProcedureCallParameters(programScope, controlFlowGraph); - controlFlowGraph = pass1ProcedureCallParameters.generate(); - log.append("CONTROL FLOW GRAPH WITH ASSIGNMENT CALL"); - log.append(controlFlowGraph.toString()); + Pass1ProcedureCallParameters pass1ProcedureCallParameters = + new Pass1ProcedureCallParameters(programScope, controlFlowGraph); + controlFlowGraph = pass1ProcedureCallParameters.generate(); + log.append("CONTROL FLOW GRAPH WITH ASSIGNMENT CALL"); + log.append(controlFlowGraph.toString()); - Pass1GenerateSingleStaticAssignmentForm pass1GenerateSingleStaticAssignmentForm = - new Pass1GenerateSingleStaticAssignmentForm(log, programScope, controlFlowGraph); - pass1GenerateSingleStaticAssignmentForm.generate(); + Pass1GenerateSingleStaticAssignmentForm pass1GenerateSingleStaticAssignmentForm = + new Pass1GenerateSingleStaticAssignmentForm(log, programScope, controlFlowGraph); + pass1GenerateSingleStaticAssignmentForm.generate(); - log.append("CONTROL FLOW GRAPH SSA"); - log.append(controlFlowGraph.toString()); + log.append("CONTROL FLOW GRAPH SSA"); + log.append(controlFlowGraph.toString()); - Pass1ProcedureCallsReturnValue pass1ProcedureCallsReturnValue = - new Pass1ProcedureCallsReturnValue(programScope, controlFlowGraph); - controlFlowGraph = pass1ProcedureCallsReturnValue.generate(); - log.append("CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN"); - log.append(controlFlowGraph.toString()); + Pass1ProcedureCallsReturnValue pass1ProcedureCallsReturnValue = + new Pass1ProcedureCallsReturnValue(programScope, controlFlowGraph); + controlFlowGraph = pass1ProcedureCallsReturnValue.generate(); + log.append("CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN"); + log.append(controlFlowGraph.toString()); - List optimizations = new ArrayList<>(); - optimizations.add(new Pass2CullEmptyBlocks(controlFlowGraph, programScope, log)); - optimizations.add(new Pass2ConstantPropagation(controlFlowGraph, programScope, log)); - optimizations.add(new Pass2ConstantAdditionElimination(controlFlowGraph, programScope, log)); - optimizations.add(new Pass2AliasElimination(controlFlowGraph, programScope, log)); - optimizations.add(new Pass2RedundantPhiElimination(controlFlowGraph, programScope, log)); - optimizations.add(new Pass2SelfPhiElimination(controlFlowGraph, programScope, log)); - optimizations.add(new Pass2ConditionalJumpSimplification(controlFlowGraph, programScope, log)); + List optimizations = new ArrayList<>(); + optimizations.add(new Pass2CullEmptyBlocks(controlFlowGraph, programScope, log)); + optimizations.add(new Pass2ConstantPropagation(controlFlowGraph, programScope, log)); + optimizations.add(new Pass2ConstantAdditionElimination(controlFlowGraph, programScope, log)); + optimizations.add(new Pass2AliasElimination(controlFlowGraph, programScope, log)); + optimizations.add(new Pass2RedundantPhiElimination(controlFlowGraph, programScope, log)); + optimizations.add(new Pass2SelfPhiElimination(controlFlowGraph, programScope, log)); + optimizations.add(new Pass2ConditionalJumpSimplification(controlFlowGraph, programScope, log)); - List assertions = new ArrayList<>(); - assertions.add(new Pass2AssertSymbols(controlFlowGraph, programScope)); - assertions.add(new Pass2AssertBlocks(controlFlowGraph, programScope)); + List assertions = new ArrayList<>(); + assertions.add(new Pass2AssertSymbols(controlFlowGraph, programScope)); + assertions.add(new Pass2AssertBlocks(controlFlowGraph, programScope)); - boolean ssaOptimized = true; - while (ssaOptimized) { - for (Pass2SsaAssertion assertion : assertions) { - assertion.check(); - } - ssaOptimized = false; - for (Pass2SsaOptimization optimization : optimizations) { - boolean stepOptimized = optimization.optimize(); - if (stepOptimized) { - log.append("Succesful SSA optimization "+optimization.getClass().getSimpleName()+""); - ssaOptimized = true; - log.append("CONTROL FLOW GRAPH"); - log.append(controlFlowGraph.toString()); + boolean ssaOptimized = true; + while (ssaOptimized) { + for (Pass2SsaAssertion assertion : assertions) { + assertion.check(); + } + ssaOptimized = false; + for (Pass2SsaOptimization optimization : optimizations) { + boolean stepOptimized = optimization.optimize(); + if (stepOptimized) { + log.append("Succesful SSA optimization " + optimization.getClass().getSimpleName() + ""); + ssaOptimized = true; + log.append("CONTROL FLOW GRAPH"); + log.append(controlFlowGraph.toString()); + } } } - } - Pass3BlockSequencePlanner pass3BlockSequencePlanner = new Pass3BlockSequencePlanner(controlFlowGraph, programScope); - pass3BlockSequencePlanner.plan(); - Pass3RegisterAllocation pass3RegisterAllocation = new Pass3RegisterAllocation(controlFlowGraph, programScope); - pass3RegisterAllocation.allocate(); - Pass3CodeGeneration pass3CodeGeneration = new Pass3CodeGeneration(controlFlowGraph, programScope); - AsmProgram asmProgram = pass3CodeGeneration.generate(); + Pass3BlockSequencePlanner pass3BlockSequencePlanner = new Pass3BlockSequencePlanner( + controlFlowGraph, + programScope); + pass3BlockSequencePlanner.plan(); + Pass3RegisterAllocation pass3RegisterAllocation = new Pass3RegisterAllocation(controlFlowGraph, programScope); + pass3RegisterAllocation.allocate(); + Pass3CodeGeneration pass3CodeGeneration = new Pass3CodeGeneration(controlFlowGraph, programScope); + AsmProgram asmProgram = pass3CodeGeneration.generate(); - log.append("INITIAL ASM"); - log.append(asmProgram.toString()); + log.append("INITIAL ASM"); + log.append(asmProgram.toString()); - List pass4Optimizations = new ArrayList<>(); - pass4Optimizations.add(new Pass4NextJumpElimination(asmProgram, log)); - pass4Optimizations.add(new Pass4UnnecesaryLoadElimination(asmProgram, log)); - boolean asmOptimized = true; - while(asmOptimized) { - asmOptimized = false; - for (Pass4AsmOptimization optimization : pass4Optimizations) { - boolean stepOtimized = optimization.optimize(); - if(stepOtimized) { - log.append("Succesful ASM optimization "+optimization.getClass().getSimpleName()); - asmOptimized = true; - log.append("ASSEMBLER"); - log.append(asmProgram.toString()); + List pass4Optimizations = new ArrayList<>(); + pass4Optimizations.add(new Pass4NextJumpElimination(asmProgram, log)); + pass4Optimizations.add(new Pass4UnnecesaryLoadElimination(asmProgram, log)); + boolean asmOptimized = true; + while (asmOptimized) { + asmOptimized = false; + for (Pass4AsmOptimization optimization : pass4Optimizations) { + boolean stepOtimized = optimization.optimize(); + if (stepOtimized) { + log.append("Succesful ASM optimization " + optimization.getClass().getSimpleName()); + asmOptimized = true; + log.append("ASSEMBLER"); + log.append(asmProgram.toString()); + } } } - } - return new CompilationResult(asmProgram, controlFlowGraph, programScope, log); + log.append("FINAL SYMBOL TABLE"); + log.append(programScope.getSymbolTableContents()); + log.append("FINAL CODE"); + log.append(asmProgram.toString()); + + return new CompilationResult(asmProgram, controlFlowGraph, programScope, log); + } catch (Exception e) { + System.out.println(log.getLog()); + throw e; + } } } diff --git a/src/dk/camelot64/kickc/TODO.txt b/src/dk/camelot64/kickc/TODO.txt index b996eeae3..37b9f9747 100644 --- a/src/dk/camelot64/kickc/TODO.txt +++ b/src/dk/camelot64/kickc/TODO.txt @@ -1,8 +1,8 @@ Features - Move the main code into a main() function, and disallow code outside functions. The main function per default has no parameters and exits with RTS. +- Add a for loop for(init;condition;increment) {stmt} -> { init; do { stmt; increment } while (condition) } - Implement Register Allocation (that utilize real registers - and non-zeropage memory) - Add Fixed Point number types -- Add a for loop for(init;condition;increment) {stmt} -> { init; do { stmt; increment } while (condition) } - Add imports - Add structs - Let { stmt } introduce a new anonymous scope. diff --git a/src/dk/camelot64/kickc/icl/Pass1ProcedureCallParameters.java b/src/dk/camelot64/kickc/icl/Pass1ProcedureCallParameters.java index 2eed78f3b..ab1b5cbf9 100644 --- a/src/dk/camelot64/kickc/icl/Pass1ProcedureCallParameters.java +++ b/src/dk/camelot64/kickc/icl/Pass1ProcedureCallParameters.java @@ -44,7 +44,8 @@ public class Pass1ProcedureCallParameters extends ControlFlowGraphCopyVisitor { // No return type. Remove variable receiving the result. LValue lValue = origCall.getLValue(); if(lValue instanceof Variable) { - scope.remove((Variable) lValue); + Variable lVar = (Variable) lValue; + lVar.getScope().remove(lVar); } } diff --git a/src/dk/camelot64/kickc/icl/Pass2CullEmptyBlocks.java b/src/dk/camelot64/kickc/icl/Pass2CullEmptyBlocks.java index 923a266b1..afb6045a5 100644 --- a/src/dk/camelot64/kickc/icl/Pass2CullEmptyBlocks.java +++ b/src/dk/camelot64/kickc/icl/Pass2CullEmptyBlocks.java @@ -62,7 +62,7 @@ public class Pass2CullEmptyBlocks extends Pass2SsaOptimization { }; phiFixVisitor.visitBlock(successor); getGraph().getAllBlocks().remove(removeBlock); - getSymbols().remove(removeBlock.getLabel()); + removeBlock.getLabel().getScope().remove(removeBlock.getLabel()); log.append("Culled Empty Block " + removeBlock.getLabel()); } return remove.size()>0; diff --git a/src/dk/camelot64/kickc/icl/Pass3RegisterAllocation.java b/src/dk/camelot64/kickc/icl/Pass3RegisterAllocation.java index e93eaef6f..28da6d4b1 100644 --- a/src/dk/camelot64/kickc/icl/Pass3RegisterAllocation.java +++ b/src/dk/camelot64/kickc/icl/Pass3RegisterAllocation.java @@ -139,13 +139,13 @@ public class Pass3RegisterAllocation { allocation.allocate(symbols.getVariable("flip::$0"), RegisterAllocation.getRegisterA()); allocation.allocate(symbols.getVariable("flip::$8"), RegisterAllocation.getRegisterA()); allocation.allocate(symbols.getVariable("flip::$4"), RegisterAllocation.getRegisterA()); - allocation.allocate(symbols.getVariable("$1"), RegisterAllocation.getRegisterA()); - allocation.allocate(symbols.getVariable("$3"), RegisterAllocation.getRegisterA()); - allocation.allocate(symbols.getVariable("c#0"), RegisterAllocation.getRegisterX()); - allocation.allocate(symbols.getVariable("c#1"), RegisterAllocation.getRegisterX()); - allocation.allocate(symbols.getVariable("c#2"), RegisterAllocation.getRegisterX()); - allocation.allocate(symbols.getVariable("c#3"), RegisterAllocation.getRegisterX()); - allocation.allocate(symbols.getVariable("c#4"), RegisterAllocation.getRegisterX()); + allocation.allocate(symbols.getVariable("main::$1"), RegisterAllocation.getRegisterA()); + allocation.allocate(symbols.getVariable("main::$3"), RegisterAllocation.getRegisterA()); + allocation.allocate(symbols.getVariable("main::c#0"), RegisterAllocation.getRegisterX()); + allocation.allocate(symbols.getVariable("main::c#1"), RegisterAllocation.getRegisterX()); + allocation.allocate(symbols.getVariable("main::c#2"), RegisterAllocation.getRegisterX()); + allocation.allocate(symbols.getVariable("main::c#3"), RegisterAllocation.getRegisterX()); + allocation.allocate(symbols.getVariable("main::c#4"), RegisterAllocation.getRegisterX()); symbols.setAllocation(allocation); } diff --git a/src/dk/camelot64/kickc/test/flipper-rex2.kc b/src/dk/camelot64/kickc/test/flipper-rex2.kc index 9dad14303..3dc8e7502 100644 --- a/src/dk/camelot64/kickc/test/flipper-rex2.kc +++ b/src/dk/camelot64/kickc/test/flipper-rex2.kc @@ -1,20 +1,23 @@ byte[1000] SCREEN = $0400; byte[16*16] buffer1 = $1000; byte[16*16] buffer2 = $1100; - byte *RASTER = $d012; -prepare(); -do { - byte c = 25; - do{ - do { } while(*RASTER!=254) - do { } while(*RASTER!=255) - c--; - } while(c!=0) - flip(); - plot(); -} while(true) +main(); + +void main() { + prepare(); + do { + byte c = 25; + do{ + do { } while(*RASTER!=254) + do { } while(*RASTER!=255) + c--; + } while(c!=0) + flip(); + plot(); + } while(true) +} // Prepare buffer void prepare() { diff --git a/src/dk/camelot64/kickc/test/ref/flipper-rex2.asm b/src/dk/camelot64/kickc/test/ref/flipper-rex2.asm index e1260588b..a6064dd30 100644 --- a/src/dk/camelot64/kickc/test/ref/flipper-rex2.asm +++ b/src/dk/camelot64/kickc/test/ref/flipper-rex2.asm @@ -1,31 +1,35 @@ BBEGIN: + jsr main +BEND: +main: jsr prepare -B2_from_BBEGIN: +main__B2_from_main: ldx #25 - jmp B2 -B2_from_B20: + jmp main__B2 +main__B2_from_B18: ldx #25 -B2_from_B6: -B2: -B3: +main__B2_from_B2: +main__B2: +main__B3: lda 53266 cmp #254 - bne B3 -B4: + bne main__main__B3 +main__B4: lda 53266 cmp #255 - bne B4 -B6: + bne main__main__B4 +B2: dex cpx #0 - bne B2_from_B6 -B7: + bne main__B2_from_B2 +B3: jsr flip -B19: +B17: jsr plot -B20: - jmp B2_from_B20 -BEND: +B18: + jmp main__B2_from_B18 +main__Breturn: + rts plot: plot__B1_from_plot: lda #16 @@ -35,7 +39,7 @@ plot__B1_from_plot: sta 101 lda #>1236 sta 101+1 -plot__B1_from_B15: +plot__B1_from_B12: plot__B1: plot__B2_from_B1: ldy #0 @@ -47,7 +51,7 @@ plot__B2: iny cpy #16 bcc plot__B2_from_B2 -B15: +B12: lda 101 clc adc #40 @@ -57,7 +61,7 @@ B15: !: dec 100 lda 100 - bne plot__B1_from_B15 + bne plot__B1_from_B12 plot__Breturn: rts flip: @@ -66,7 +70,7 @@ flip__B1_from_flip: sta 104 ldx #0 ldy #15 -flip__B1_from_B11: +flip__B1_from_B8: flip__B1: flip__B2_from_B1: lda #16 @@ -83,12 +87,12 @@ flip__B2: dec 103 lda 103 bne flip__B2_from_B2 -B11: +B8: dey dec 104 lda 104 - bne flip__B1_from_B11 -flip__B3_from_B11: + bne flip__B1_from_B8 +flip__B3_from_B8: ldx #0 flip__B3_from_B3: flip__B3: diff --git a/src/dk/camelot64/kickc/test/ref/flipper-rex2.cfg b/src/dk/camelot64/kickc/test/ref/flipper-rex2.cfg index aaa567143..fe1ab67c1 100644 --- a/src/dk/camelot64/kickc/test/ref/flipper-rex2.cfg +++ b/src/dk/camelot64/kickc/test/ref/flipper-rex2.cfg @@ -1,31 +1,37 @@ @BEGIN: from - call prepare param-assignment - to:@2 -@2: from @20 @6 @BEGIN - (byte) c#2 ← phi( @20/(byte) 25 @6/(byte) c#1 @BEGIN/(byte) 25 ) - to:@3 -@3: from @2 @3 - (byte~) $1 ← * (word) 53266 - if((byte~) $1!=(byte) 254) goto @3 - to:@4 -@4: from @3 @4 - (byte~) $3 ← * (word) 53266 - if((byte~) $3!=(byte) 255) goto @4 - to:@6 -@6: from @4 - (byte) c#1 ← -- (byte) c#2 - if((byte) c#1!=(byte) 0) goto @2 - to:@7 -@7: from @6 - call flip param-assignment - to:@19 -@19: from @7 - call plot param-assignment - to:@20 -@20: from @19 - if(true) goto @2 + call main param-assignment to:@END -prepare: from @BEGIN +main: from @BEGIN + call prepare param-assignment + to:main::@2 +main::@2: from @18 @2 main + (byte) main::c#2 ← phi( @2/(byte) main::c#1 @18/(byte) 25 main/(byte) 25 ) + to:main::@3 +main::@3: from main::@2 main::@3 + (byte~) main::$1 ← * (word) 53266 + if((byte~) main::$1!=(byte) 254) goto main::@3 + to:main::@4 +main::@4: from main::@3 main::@4 + (byte~) main::$3 ← * (word) 53266 + if((byte~) main::$3!=(byte) 255) goto main::@4 + to:@2 +@2: from main::@4 + (byte) main::c#1 ← -- (byte) main::c#2 + if((byte) main::c#1!=(byte) 0) goto main::@2 + to:@3 +@3: from @2 + call flip param-assignment + to:@17 +@17: from @3 + call plot param-assignment + to:@18 +@18: from @17 + if(true) goto main::@2 + to:main::@return +main::@return: from @18 + return + to:@RETURN +prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 (byte) prepare::i#2 ← phi( prepare/(byte) 0 prepare::@1/(byte) prepare::i#1 ) @@ -36,12 +42,12 @@ prepare::@1: from prepare prepare::@1 prepare::@return: from prepare::@1 return to:@RETURN -flip: from @7 +flip: from @3 to:flip::@1 -flip::@1: from @11 flip - (byte) flip::r#2 ← phi( @11/(byte) flip::r#1 flip/(byte) 16 ) - (byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#1 flip/(byte) 0 ) - (byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) 15 ) +flip::@1: from @8 flip + (byte) flip::r#2 ← phi( @8/(byte) flip::r#1 flip/(byte) 16 ) + (byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#1 flip/(byte) 0 ) + (byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) 15 ) to:flip::@2 flip::@2: from flip::@1 flip::@2 (byte) flip::c#2 ← phi( flip::@1/(byte) 16 flip::@2/(byte) flip::c#1 ) @@ -53,14 +59,14 @@ flip::@2: from flip::@1 flip::@2 (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 (byte) flip::c#1 ← -- (byte) flip::c#2 if((byte) flip::c#1!=(byte) 0) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 (byte) flip::r#1 ← -- (byte) flip::r#2 if((byte) flip::r#1!=(byte) 0) goto flip::@1 to:flip::@3 -flip::@3: from @11 flip::@3 - (byte) flip::i#2 ← phi( @11/(byte) 0 flip::@3/(byte) flip::i#1 ) +flip::@3: from @8 flip::@3 + (byte) flip::i#2 ← phi( @8/(byte) 0 flip::@3/(byte) flip::i#1 ) (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 *((word) 4096 + (byte) flip::i#2) ← (byte~) flip::$4 (byte) flip::i#1 ← ++ (byte) flip::i#2 @@ -69,12 +75,12 @@ flip::@3: from @11 flip::@3 flip::@return: from flip::@3 return to:@RETURN -plot: from @19 +plot: from @17 to:plot::@1 -plot::@1: from @15 plot - (byte) plot::y#2 ← phi( @15/(byte) plot::y#1 plot/(byte) 16 ) - (byte) plot::i#3 ← phi( @15/(byte) plot::i#1 plot/(byte) 0 ) - (byte*) plot::line#2 ← phi( @15/(byte*) plot::line#1 plot/(word) 1236 ) +plot::@1: from @12 plot + (byte) plot::y#2 ← phi( @12/(byte) plot::y#1 plot/(byte) 16 ) + (byte) plot::i#3 ← phi( @12/(byte) plot::i#1 plot/(byte) 0 ) + (byte*) plot::line#2 ← phi( @12/(byte*) plot::line#1 plot/(word) 1236 ) to:plot::@2 plot::@2: from plot::@1 plot::@2 (byte) plot::x#2 ← phi( plot::@1/(byte) 0 plot::@2/(byte) plot::x#1 ) @@ -84,13 +90,13 @@ plot::@2: from plot::@1 plot::@2 (byte) plot::i#1 ← ++ (byte) plot::i#2 (byte) plot::x#1 ← ++ (byte) plot::x#2 if((byte) plot::x#1<(byte) 16) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 (byte) plot::y#1 ← -- (byte) plot::y#2 if((byte) plot::y#1!=(byte) 0) goto plot::@1 to:plot::@return -plot::@return: from @15 +plot::@return: from @12 return to:@RETURN -@END: from @20 +@END: from @BEGIN diff --git a/src/dk/camelot64/kickc/test/ref/flipper-rex2.log b/src/dk/camelot64/kickc/test/ref/flipper-rex2.log index bf058b9a6..367d5476d 100644 --- a/src/dk/camelot64/kickc/test/ref/flipper-rex2.log +++ b/src/dk/camelot64/kickc/test/ref/flipper-rex2.log @@ -1,20 +1,23 @@ byte[1000] SCREEN = $0400; byte[16*16] buffer1 = $1000; byte[16*16] buffer2 = $1100; - byte *RASTER = $d012; -prepare(); -do { - byte c = 25; - do{ - do { } while(*RASTER!=254) - do { } while(*RASTER!=255) - c--; - } while(c!=0) - flip(); - plot(); -} while(true) +main(); + +void main() { + prepare(); + do { + byte c = 25; + do{ + do { } while(*RASTER!=254) + do { } while(*RASTER!=255) + c--; + } while(c!=0) + flip(); + plot(); + } while(true) +} // Prepare buffer void prepare() { @@ -56,7 +59,7 @@ void plot() { line = line+40; } while(--y!=0) } -Adding pre/post-modifier (byte) c ← -- (byte) c +Adding pre/post-modifier (byte) main::c ← -- (byte) main::c Adding pre/post-modifier (byte) prepare::i ← ++ (byte) prepare::i Adding pre/post-modifier (byte) flip::srcIdx ← ++ (byte) flip::srcIdx Adding pre/post-modifier (byte) flip::c ← -- (byte) flip::c @@ -71,24 +74,29 @@ PROGRAM (byte[256]) buffer1 ← (word) 4096 (byte[256]) buffer2 ← (word) 4352 (byte*) RASTER ← (word) 53266 - (void~) $0 ← call prepare -@1: - (byte) c ← (byte) 25 -@2: -@3: - (byte~) $1 ← * (byte*) RASTER - (boolean~) $2 ← (byte~) $1 != (byte) 254 - if((boolean~) $2) goto @3 -@4: - (byte~) $3 ← * (byte*) RASTER - (boolean~) $4 ← (byte~) $3 != (byte) 255 - if((boolean~) $4) goto @4 - (byte) c ← -- (byte) c - (boolean~) $5 ← (byte) c != (byte) 0 - if((boolean~) $5) goto @2 - (void~) $6 ← call flip - (void~) $7 ← call plot - if(true) goto @1 + (void~) $0 ← call main + proc (void()) main() + (void~) main::$0 ← call prepare +main::@1: + (byte) main::c ← (byte) 25 +main::@2: +main::@3: + (byte~) main::$1 ← * (byte*) RASTER + (boolean~) main::$2 ← (byte~) main::$1 != (byte) 254 + if((boolean~) main::$2) goto main::@3 +main::@4: + (byte~) main::$3 ← * (byte*) RASTER + (boolean~) main::$4 ← (byte~) main::$3 != (byte) 255 + if((boolean~) main::$4) goto main::@4 + (byte) main::c ← -- (byte) main::c + (boolean~) main::$5 ← (byte) main::c != (byte) 0 + if((boolean~) main::$5) goto main::@2 + (void~) main::$6 ← call flip + (void~) main::$7 ← call plot + if(true) goto main::@1 +main::@return: + return + endproc // main() proc (void()) prepare() (byte) prepare::i ← (byte) 0 prepare::@1: @@ -155,22 +163,10 @@ plot::@return: SYMBOLS (void~) $0 -(byte~) $1 -(boolean~) $2 -(byte~) $3 -(boolean~) $4 -(boolean~) $5 -(void~) $6 -(void~) $7 -(label) @1 -(label) @2 -(label) @3 -(label) @4 (byte*) RASTER (byte[1000]) SCREEN (byte[256]) buffer1 (byte[256]) buffer2 -(byte) c (void()) flip() (byte~) flip::$0 (byte~) flip::$1 @@ -188,6 +184,22 @@ SYMBOLS (byte) flip::r (byte) flip::srcIdx +(void()) main() +(void~) main::$0 +(byte~) main::$1 +(boolean~) main::$2 +(byte~) main::$3 +(boolean~) main::$4 +(boolean~) main::$5 +(void~) main::$6 +(void~) main::$7 +(label) main::@1 +(label) main::@2 +(label) main::@3 +(label) main::@4 +(label) main::@return +(byte) main::c + (void()) plot() (byte~) plot::$0 (byte*~) plot::$1 @@ -217,37 +229,45 @@ INITIAL CONTROL FLOW GRAPH (byte[256]) buffer1 ← (word) 4096 (byte[256]) buffer2 ← (word) 4352 (byte*) RASTER ← (word) 53266 - (void~) $0 ← call prepare - to:@1 -@1: from @7 @BEGIN - (byte) c ← (byte) 25 - to:@2 -@2: from @1 @6 - to:@3 -@3: from @2 @3 - (byte~) $1 ← * (byte*) RASTER - (boolean~) $2 ← (byte~) $1 != (byte) 254 - if((boolean~) $2) goto @3 + (void~) $0 ← call main to:@5 -@5: from @3 +main: from + (void~) main::$0 ← call prepare + to:main::@1 +main::@1: from @3 main + (byte) main::c ← (byte) 25 + to:main::@2 +main::@2: from @2 main::@1 + to:main::@3 +main::@3: from main::@2 main::@3 + (byte~) main::$1 ← * (byte*) RASTER + (boolean~) main::$2 ← (byte~) main::$1 != (byte) 254 + if((boolean~) main::$2) goto main::@3 + to:@1 +@1: from main::@3 + to:main::@4 +main::@4: from @1 main::@4 + (byte~) main::$3 ← * (byte*) RASTER + (boolean~) main::$4 ← (byte~) main::$3 != (byte) 255 + if((boolean~) main::$4) goto main::@4 + to:@2 +@2: from main::@4 + (byte) main::c ← -- (byte) main::c + (boolean~) main::$5 ← (byte) main::c != (byte) 0 + if((boolean~) main::$5) goto main::@2 + to:@3 +@3: from @2 + (void~) main::$6 ← call flip + (void~) main::$7 ← call plot + if(true) goto main::@1 to:@4 -@4: from @4 @5 - (byte~) $3 ← * (byte*) RASTER - (boolean~) $4 ← (byte~) $3 != (byte) 255 - if((boolean~) $4) goto @4 - to:@6 -@6: from @4 - (byte) c ← -- (byte) c - (boolean~) $5 ← (byte) c != (byte) 0 - if((boolean~) $5) goto @2 +@4: from @3 + to:main::@return +main::@return: from @4 + return + to:@RETURN +@5: from @BEGIN to:@7 -@7: from @6 - (void~) $6 ← call flip - (void~) $7 ← call plot - if(true) goto @1 - to:@8 -@8: from @7 - to:@10 prepare: from (byte) prepare::i ← (byte) 0 to:prepare::@1 @@ -256,20 +276,20 @@ prepare::@1: from prepare prepare::@1 (byte) prepare::i ← ++ (byte) prepare::i (boolean~) prepare::$0 ← (byte) prepare::i != (byte) 0 if((boolean~) prepare::$0) goto prepare::@1 - to:@9 -@9: from prepare::@1 + to:@6 +@6: from prepare::@1 to:prepare::@return -prepare::@return: from @9 +prepare::@return: from @6 return to:@RETURN -@10: from @8 - to:@14 +@7: from @5 + to:@11 flip: from (byte) flip::srcIdx ← (byte) 0 (byte) flip::dstIdx ← (byte) 15 (byte) flip::r ← (byte) 16 to:flip::@1 -flip::@1: from @11 flip +flip::@1: from @8 flip (byte) flip::c ← (byte) 16 to:flip::@2 flip::@2: from flip::@1 flip::@2 @@ -281,30 +301,30 @@ flip::@2: from flip::@1 flip::@2 (byte) flip::c ← -- (byte) flip::c (boolean~) flip::$2 ← (byte) flip::c != (byte) 0 if((boolean~) flip::$2) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte) flip::dstIdx ← -- (byte) flip::dstIdx (byte) flip::r ← -- (byte) flip::r (boolean~) flip::$3 ← (byte) flip::r != (byte) 0 if((boolean~) flip::$3) goto flip::@1 - to:@12 -@12: from @11 + to:@9 +@9: from @8 (byte) flip::i ← (byte) 0 to:flip::@3 -flip::@3: from @12 flip::@3 +flip::@3: from @9 flip::@3 (byte~) flip::$4 ← (byte[256]) buffer2 *idx (byte) flip::i *((byte[256]) buffer1 + (byte) flip::i) ← (byte~) flip::$4 (byte) flip::i ← ++ (byte) flip::i (boolean~) flip::$5 ← (byte) flip::i != (byte) 0 if((boolean~) flip::$5) goto flip::@3 - to:@13 -@13: from flip::@3 + to:@10 +@10: from flip::@3 to:flip::@return -flip::@return: from @13 +flip::@return: from @10 return to:@RETURN -@14: from @10 - to:@17 +@11: from @7 + to:@14 plot: from (byte~) plot::$0 ← (byte) 5 * (byte) 40 (byte*~) plot::$1 ← (byte[1000]) SCREEN + (byte~) plot::$0 @@ -313,7 +333,7 @@ plot: from (byte) plot::y ← (byte) 16 (byte) plot::i ← (byte) 0 to:plot::@1 -plot::@1: from @15 plot +plot::@1: from @12 plot (byte) plot::x ← (byte) 0 to:plot::@2 plot::@2: from plot::@1 plot::@2 @@ -323,22 +343,22 @@ plot::@2: from plot::@1 plot::@2 (byte) plot::x ← ++ (byte) plot::x (boolean~) plot::$4 ← (byte) plot::x < (byte) 16 if((boolean~) plot::$4) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte*~) plot::$5 ← (byte*) plot::line + (byte) 40 (byte*) plot::line ← (byte*~) plot::$5 (byte) plot::y ← -- (byte) plot::y (boolean~) plot::$6 ← (byte) plot::y != (byte) 0 if((boolean~) plot::$6) goto plot::@1 - to:@16 -@16: from @15 + to:@13 +@13: from @12 to:plot::@return -plot::@return: from @16 +plot::@return: from @13 return to:@RETURN -@17: from @14 +@14: from @11 to:@END -@END: from @17 +@END: from @14 CONTROL FLOW GRAPH WITH ASSIGNMENT CALL @BEGIN: from @@ -346,44 +366,54 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL (byte[256]) buffer1 ← (word) 4096 (byte[256]) buffer2 ← (word) 4352 (byte*) RASTER ← (word) 53266 - call prepare param-assignment - to:@18 -@18: from @BEGIN - to:@1 -@1: from @18 @20 - (byte) c ← (byte) 25 - to:@2 -@2: from @1 @6 - to:@3 -@3: from @2 @3 - (byte~) $1 ← * (byte*) RASTER - (boolean~) $2 ← (byte~) $1 != (byte) 254 - if((boolean~) $2) goto @3 + call main param-assignment + to:@15 +@15: from @BEGIN to:@5 -@5: from @3 - to:@4 -@4: from @4 @5 - (byte~) $3 ← * (byte*) RASTER - (boolean~) $4 ← (byte~) $3 != (byte) 255 - if((boolean~) $4) goto @4 - to:@6 -@6: from @4 - (byte) c ← -- (byte) c - (boolean~) $5 ← (byte) c != (byte) 0 - if((boolean~) $5) goto @2 - to:@7 -@7: from @6 +main: from @BEGIN + call prepare param-assignment + to:@16 +@16: from main + to:main::@1 +main::@1: from @16 @18 + (byte) main::c ← (byte) 25 + to:main::@2 +main::@2: from @2 main::@1 + to:main::@3 +main::@3: from main::@2 main::@3 + (byte~) main::$1 ← * (byte*) RASTER + (boolean~) main::$2 ← (byte~) main::$1 != (byte) 254 + if((boolean~) main::$2) goto main::@3 + to:@1 +@1: from main::@3 + to:main::@4 +main::@4: from @1 main::@4 + (byte~) main::$3 ← * (byte*) RASTER + (boolean~) main::$4 ← (byte~) main::$3 != (byte) 255 + if((boolean~) main::$4) goto main::@4 + to:@2 +@2: from main::@4 + (byte) main::c ← -- (byte) main::c + (boolean~) main::$5 ← (byte) main::c != (byte) 0 + if((boolean~) main::$5) goto main::@2 + to:@3 +@3: from @2 call flip param-assignment - to:@19 -@19: from @7 + to:@17 +@17: from @3 call plot param-assignment - to:@20 -@20: from @19 - if(true) goto @1 - to:@8 -@8: from @20 - to:@10 -prepare: from @BEGIN + to:@18 +@18: from @17 + if(true) goto main::@1 + to:@4 +@4: from @18 + to:main::@return +main::@return: from @4 + return + to:@RETURN +@5: from @15 + to:@7 +prepare: from main (byte) prepare::i ← (byte) 0 to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -391,20 +421,20 @@ prepare::@1: from prepare prepare::@1 (byte) prepare::i ← ++ (byte) prepare::i (boolean~) prepare::$0 ← (byte) prepare::i != (byte) 0 if((boolean~) prepare::$0) goto prepare::@1 - to:@9 -@9: from prepare::@1 + to:@6 +@6: from prepare::@1 to:prepare::@return -prepare::@return: from @9 +prepare::@return: from @6 return to:@RETURN -@10: from @8 - to:@14 -flip: from @7 +@7: from @5 + to:@11 +flip: from @3 (byte) flip::srcIdx ← (byte) 0 (byte) flip::dstIdx ← (byte) 15 (byte) flip::r ← (byte) 16 to:flip::@1 -flip::@1: from @11 flip +flip::@1: from @8 flip (byte) flip::c ← (byte) 16 to:flip::@2 flip::@2: from flip::@1 flip::@2 @@ -416,31 +446,31 @@ flip::@2: from flip::@1 flip::@2 (byte) flip::c ← -- (byte) flip::c (boolean~) flip::$2 ← (byte) flip::c != (byte) 0 if((boolean~) flip::$2) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte) flip::dstIdx ← -- (byte) flip::dstIdx (byte) flip::r ← -- (byte) flip::r (boolean~) flip::$3 ← (byte) flip::r != (byte) 0 if((boolean~) flip::$3) goto flip::@1 - to:@12 -@12: from @11 + to:@9 +@9: from @8 (byte) flip::i ← (byte) 0 to:flip::@3 -flip::@3: from @12 flip::@3 +flip::@3: from @9 flip::@3 (byte~) flip::$4 ← (byte[256]) buffer2 *idx (byte) flip::i *((byte[256]) buffer1 + (byte) flip::i) ← (byte~) flip::$4 (byte) flip::i ← ++ (byte) flip::i (boolean~) flip::$5 ← (byte) flip::i != (byte) 0 if((boolean~) flip::$5) goto flip::@3 - to:@13 -@13: from flip::@3 + to:@10 +@10: from flip::@3 to:flip::@return -flip::@return: from @13 +flip::@return: from @10 return to:@RETURN -@14: from @10 - to:@17 -plot: from @19 +@11: from @7 + to:@14 +plot: from @17 (byte~) plot::$0 ← (byte) 5 * (byte) 40 (byte*~) plot::$1 ← (byte[1000]) SCREEN + (byte~) plot::$0 (byte*~) plot::$2 ← (byte*~) plot::$1 + (byte) 12 @@ -448,7 +478,7 @@ plot: from @19 (byte) plot::y ← (byte) 16 (byte) plot::i ← (byte) 0 to:plot::@1 -plot::@1: from @15 plot +plot::@1: from @12 plot (byte) plot::x ← (byte) 0 to:plot::@2 plot::@2: from plot::@1 plot::@2 @@ -458,22 +488,22 @@ plot::@2: from plot::@1 plot::@2 (byte) plot::x ← ++ (byte) plot::x (boolean~) plot::$4 ← (byte) plot::x < (byte) 16 if((boolean~) plot::$4) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte*~) plot::$5 ← (byte*) plot::line + (byte) 40 (byte*) plot::line ← (byte*~) plot::$5 (byte) plot::y ← -- (byte) plot::y (boolean~) plot::$6 ← (byte) plot::y != (byte) 0 if((boolean~) plot::$6) goto plot::@1 - to:@16 -@16: from @15 + to:@13 +@13: from @12 to:plot::@return -plot::@return: from @16 +plot::@return: from @13 return to:@RETURN -@17: from @14 +@14: from @11 to:@END -@END: from @17 +@END: from @14 Completing Phi functions... Completing Phi functions... @@ -493,90 +523,104 @@ CONTROL FLOW GRAPH SSA (byte[256]) buffer1#0 ← (word) 4096 (byte[256]) buffer2#0 ← (word) 4352 (byte*) RASTER#0 ← (word) 53266 - call prepare param-assignment - to:@18 -@18: from @BEGIN - (byte[256]) buffer2#14 ← phi( @BEGIN/(byte[256]) buffer2#0 ) - (byte[256]) buffer1#21 ← phi( @BEGIN/(byte[256]) buffer1#0 ) - (byte[1000]) SCREEN#10 ← phi( @BEGIN/(byte[1000]) SCREEN#0 ) - (byte*) RASTER#7 ← phi( @BEGIN/(byte*) RASTER#0 ) - to:@1 -@1: from @18 @20 - (byte[256]) buffer1#20 ← phi( @18/(byte[256]) buffer1#21 @20/(byte[256]) buffer1#22 ) - (byte[256]) buffer2#13 ← phi( @18/(byte[256]) buffer2#14 @20/(byte[256]) buffer2#15 ) - (byte[1000]) SCREEN#9 ← phi( @18/(byte[1000]) SCREEN#10 @20/(byte[1000]) SCREEN#11 ) - (byte*) RASTER#5 ← phi( @18/(byte*) RASTER#7 @20/(byte*) RASTER#8 ) - (byte) c#0 ← (byte) 25 - to:@2 -@2: from @1 @6 - (byte[256]) buffer2#12 ← phi( @1/(byte[256]) buffer2#13 @6/(byte[256]) buffer2#8 ) - (byte[256]) buffer1#19 ← phi( @1/(byte[256]) buffer1#20 @6/(byte[256]) buffer1#15 ) - (byte[1000]) SCREEN#8 ← phi( @1/(byte[1000]) SCREEN#9 @6/(byte[1000]) SCREEN#4 ) - (byte) c#6 ← phi( @1/(byte) c#0 @6/(byte) c#1 ) - (byte*) RASTER#3 ← phi( @1/(byte*) RASTER#5 @6/(byte*) RASTER#6 ) - to:@3 -@3: from @2 @3 - (byte[256]) buffer1#18 ← phi( @2/(byte[256]) buffer1#19 @3/(byte[256]) buffer1#18 ) - (byte[256]) buffer2#11 ← phi( @2/(byte[256]) buffer2#12 @3/(byte[256]) buffer2#11 ) - (byte[1000]) SCREEN#7 ← phi( @2/(byte[1000]) SCREEN#8 @3/(byte[1000]) SCREEN#7 ) - (byte) c#5 ← phi( @2/(byte) c#6 @3/(byte) c#5 ) - (byte*) RASTER#1 ← phi( @2/(byte*) RASTER#3 @3/(byte*) RASTER#1 ) - (byte~) $1 ← * (byte*) RASTER#1 - (boolean~) $2 ← (byte~) $1 != (byte) 254 - if((boolean~) $2) goto @3 + call main param-assignment + to:@15 +@15: from @BEGIN to:@5 -@5: from @3 - (byte[256]) buffer2#10 ← phi( @3/(byte[256]) buffer2#11 ) - (byte[256]) buffer1#17 ← phi( @3/(byte[256]) buffer1#18 ) - (byte[1000]) SCREEN#6 ← phi( @3/(byte[1000]) SCREEN#7 ) - (byte) c#4 ← phi( @3/(byte) c#5 ) - (byte*) RASTER#4 ← phi( @3/(byte*) RASTER#1 ) - to:@4 -@4: from @4 @5 - (byte[256]) buffer1#16 ← phi( @4/(byte[256]) buffer1#16 @5/(byte[256]) buffer1#17 ) - (byte[256]) buffer2#9 ← phi( @4/(byte[256]) buffer2#9 @5/(byte[256]) buffer2#10 ) - (byte[1000]) SCREEN#5 ← phi( @4/(byte[1000]) SCREEN#5 @5/(byte[1000]) SCREEN#6 ) - (byte) c#3 ← phi( @4/(byte) c#3 @5/(byte) c#4 ) - (byte*) RASTER#2 ← phi( @4/(byte*) RASTER#2 @5/(byte*) RASTER#4 ) - (byte~) $3 ← * (byte*) RASTER#2 - (boolean~) $4 ← (byte~) $3 != (byte) 255 - if((boolean~) $4) goto @4 - to:@6 -@6: from @4 - (byte[256]) buffer2#8 ← phi( @4/(byte[256]) buffer2#9 ) - (byte[256]) buffer1#15 ← phi( @4/(byte[256]) buffer1#16 ) - (byte[1000]) SCREEN#4 ← phi( @4/(byte[1000]) SCREEN#5 ) - (byte*) RASTER#6 ← phi( @4/(byte*) RASTER#2 ) - (byte) c#2 ← phi( @4/(byte) c#3 ) - (byte) c#1 ← -- (byte) c#2 - (boolean~) $5 ← (byte) c#1 != (byte) 0 - if((boolean~) $5) goto @2 - to:@7 -@7: from @6 - (byte*) RASTER#10 ← phi( @6/(byte*) RASTER#6 ) - (byte[256]) buffer1#13 ← phi( @6/(byte[256]) buffer1#15 ) - (byte[256]) buffer2#7 ← phi( @6/(byte[256]) buffer2#8 ) - (byte[1000]) SCREEN#3 ← phi( @6/(byte[1000]) SCREEN#4 ) +main: from @BEGIN + (byte[256]) buffer2#16 ← phi( @BEGIN/(byte[256]) buffer2#0 ) + (byte[1000]) SCREEN#12 ← phi( @BEGIN/(byte[1000]) SCREEN#0 ) + (byte*) RASTER#9 ← phi( @BEGIN/(byte*) RASTER#0 ) + (byte[256]) buffer1#9 ← phi( @BEGIN/(byte[256]) buffer1#0 ) + call prepare param-assignment + to:@16 +@16: from main + (byte[256]) buffer2#14 ← phi( main/(byte[256]) buffer2#16 ) + (byte[256]) buffer1#22 ← phi( main/(byte[256]) buffer1#9 ) + (byte[1000]) SCREEN#10 ← phi( main/(byte[1000]) SCREEN#12 ) + (byte*) RASTER#7 ← phi( main/(byte*) RASTER#9 ) + to:main::@1 +main::@1: from @16 @18 + (byte[256]) buffer1#21 ← phi( @16/(byte[256]) buffer1#22 @18/(byte[256]) buffer1#23 ) + (byte[256]) buffer2#13 ← phi( @16/(byte[256]) buffer2#14 @18/(byte[256]) buffer2#15 ) + (byte[1000]) SCREEN#9 ← phi( @16/(byte[1000]) SCREEN#10 @18/(byte[1000]) SCREEN#11 ) + (byte*) RASTER#6 ← phi( @16/(byte*) RASTER#7 @18/(byte*) RASTER#8 ) + (byte) main::c#0 ← (byte) 25 + to:main::@2 +main::@2: from @2 main::@1 + (byte[256]) buffer2#12 ← phi( @2/(byte[256]) buffer2#8 main::@1/(byte[256]) buffer2#13 ) + (byte[256]) buffer1#20 ← phi( @2/(byte[256]) buffer1#16 main::@1/(byte[256]) buffer1#21 ) + (byte[1000]) SCREEN#8 ← phi( @2/(byte[1000]) SCREEN#4 main::@1/(byte[1000]) SCREEN#9 ) + (byte) main::c#6 ← phi( @2/(byte) main::c#1 main::@1/(byte) main::c#0 ) + (byte*) RASTER#3 ← phi( @2/(byte*) RASTER#5 main::@1/(byte*) RASTER#6 ) + to:main::@3 +main::@3: from main::@2 main::@3 + (byte[256]) buffer1#19 ← phi( main::@2/(byte[256]) buffer1#20 main::@3/(byte[256]) buffer1#19 ) + (byte[256]) buffer2#11 ← phi( main::@2/(byte[256]) buffer2#12 main::@3/(byte[256]) buffer2#11 ) + (byte[1000]) SCREEN#7 ← phi( main::@2/(byte[1000]) SCREEN#8 main::@3/(byte[1000]) SCREEN#7 ) + (byte) main::c#5 ← phi( main::@2/(byte) main::c#6 main::@3/(byte) main::c#5 ) + (byte*) RASTER#1 ← phi( main::@2/(byte*) RASTER#3 main::@3/(byte*) RASTER#1 ) + (byte~) main::$1 ← * (byte*) RASTER#1 + (boolean~) main::$2 ← (byte~) main::$1 != (byte) 254 + if((boolean~) main::$2) goto main::@3 + to:@1 +@1: from main::@3 + (byte[256]) buffer2#10 ← phi( main::@3/(byte[256]) buffer2#11 ) + (byte[256]) buffer1#18 ← phi( main::@3/(byte[256]) buffer1#19 ) + (byte[1000]) SCREEN#6 ← phi( main::@3/(byte[1000]) SCREEN#7 ) + (byte) main::c#4 ← phi( main::@3/(byte) main::c#5 ) + (byte*) RASTER#4 ← phi( main::@3/(byte*) RASTER#1 ) + to:main::@4 +main::@4: from @1 main::@4 + (byte[256]) buffer1#17 ← phi( @1/(byte[256]) buffer1#18 main::@4/(byte[256]) buffer1#17 ) + (byte[256]) buffer2#9 ← phi( @1/(byte[256]) buffer2#10 main::@4/(byte[256]) buffer2#9 ) + (byte[1000]) SCREEN#5 ← phi( @1/(byte[1000]) SCREEN#6 main::@4/(byte[1000]) SCREEN#5 ) + (byte) main::c#3 ← phi( @1/(byte) main::c#4 main::@4/(byte) main::c#3 ) + (byte*) RASTER#2 ← phi( @1/(byte*) RASTER#4 main::@4/(byte*) RASTER#2 ) + (byte~) main::$3 ← * (byte*) RASTER#2 + (boolean~) main::$4 ← (byte~) main::$3 != (byte) 255 + if((boolean~) main::$4) goto main::@4 + to:@2 +@2: from main::@4 + (byte[256]) buffer2#8 ← phi( main::@4/(byte[256]) buffer2#9 ) + (byte[256]) buffer1#16 ← phi( main::@4/(byte[256]) buffer1#17 ) + (byte[1000]) SCREEN#4 ← phi( main::@4/(byte[1000]) SCREEN#5 ) + (byte*) RASTER#5 ← phi( main::@4/(byte*) RASTER#2 ) + (byte) main::c#2 ← phi( main::@4/(byte) main::c#3 ) + (byte) main::c#1 ← -- (byte) main::c#2 + (boolean~) main::$5 ← (byte) main::c#1 != (byte) 0 + if((boolean~) main::$5) goto main::@2 + to:@3 +@3: from @2 + (byte*) RASTER#11 ← phi( @2/(byte*) RASTER#5 ) + (byte[256]) buffer1#14 ← phi( @2/(byte[256]) buffer1#16 ) + (byte[256]) buffer2#7 ← phi( @2/(byte[256]) buffer2#8 ) + (byte[1000]) SCREEN#3 ← phi( @2/(byte[1000]) SCREEN#4 ) call flip param-assignment - to:@19 -@19: from @7 - (byte[256]) buffer2#16 ← phi( @7/(byte[256]) buffer2#7 ) - (byte*) RASTER#9 ← phi( @7/(byte*) RASTER#10 ) - (byte[256]) buffer1#14 ← phi( @7/(byte[256]) buffer1#13 ) - (byte[1000]) SCREEN#2 ← phi( @7/(byte[1000]) SCREEN#3 ) + to:@17 +@17: from @3 + (byte[256]) buffer2#17 ← phi( @3/(byte[256]) buffer2#7 ) + (byte*) RASTER#10 ← phi( @3/(byte*) RASTER#11 ) + (byte[256]) buffer1#15 ← phi( @3/(byte[256]) buffer1#14 ) + (byte[1000]) SCREEN#2 ← phi( @3/(byte[1000]) SCREEN#3 ) call plot param-assignment - to:@20 -@20: from @19 - (byte[256]) buffer2#15 ← phi( @19/(byte[256]) buffer2#16 ) - (byte[256]) buffer1#22 ← phi( @19/(byte[256]) buffer1#14 ) - (byte[1000]) SCREEN#11 ← phi( @19/(byte[1000]) SCREEN#2 ) - (byte*) RASTER#8 ← phi( @19/(byte*) RASTER#9 ) - if(true) goto @1 - to:@8 -@8: from @20 - to:@10 -prepare: from @BEGIN - (byte[256]) buffer1#5 ← phi( @BEGIN/(byte[256]) buffer1#0 ) + to:@18 +@18: from @17 + (byte[256]) buffer2#15 ← phi( @17/(byte[256]) buffer2#17 ) + (byte[256]) buffer1#23 ← phi( @17/(byte[256]) buffer1#15 ) + (byte[1000]) SCREEN#11 ← phi( @17/(byte[1000]) SCREEN#2 ) + (byte*) RASTER#8 ← phi( @17/(byte*) RASTER#10 ) + if(true) goto main::@1 + to:@4 +@4: from @18 + to:main::@return +main::@return: from @4 + return + to:@RETURN +@5: from @15 + to:@7 +prepare: from main + (byte[256]) buffer1#5 ← phi( main/(byte[256]) buffer1#9 ) (byte) prepare::i#0 ← (byte) 0 to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -586,27 +630,27 @@ prepare::@1: from prepare prepare::@1 (byte) prepare::i#1 ← ++ (byte) prepare::i#2 (boolean~) prepare::$0 ← (byte) prepare::i#1 != (byte) 0 if((boolean~) prepare::$0) goto prepare::@1 - to:@9 -@9: from prepare::@1 + to:@6 +@6: from prepare::@1 to:prepare::@return -prepare::@return: from @9 +prepare::@return: from @6 return to:@RETURN -@10: from @8 - to:@14 -flip: from @7 - (byte[256]) buffer2#6 ← phi( @7/(byte[256]) buffer2#7 ) - (byte[256]) buffer1#10 ← phi( @7/(byte[256]) buffer1#13 ) +@7: from @5 + to:@11 +flip: from @3 + (byte[256]) buffer2#6 ← phi( @3/(byte[256]) buffer2#7 ) + (byte[256]) buffer1#11 ← phi( @3/(byte[256]) buffer1#14 ) (byte) flip::srcIdx#0 ← (byte) 0 (byte) flip::dstIdx#0 ← (byte) 15 (byte) flip::r#0 ← (byte) 16 to:flip::@1 -flip::@1: from @11 flip - (byte) flip::r#4 ← phi( @11/(byte) flip::r#1 flip/(byte) flip::r#0 ) - (byte[256]) buffer1#6 ← phi( @11/(byte[256]) buffer1#9 flip/(byte[256]) buffer1#10 ) - (byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#4 flip/(byte) flip::srcIdx#0 ) - (byte[256]) buffer2#3 ← phi( @11/(byte[256]) buffer2#5 flip/(byte[256]) buffer2#6 ) - (byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) flip::dstIdx#0 ) +flip::@1: from @8 flip + (byte) flip::r#4 ← phi( @8/(byte) flip::r#1 flip/(byte) flip::r#0 ) + (byte[256]) buffer1#6 ← phi( @8/(byte[256]) buffer1#10 flip/(byte[256]) buffer1#11 ) + (byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#4 flip/(byte) flip::srcIdx#0 ) + (byte[256]) buffer2#3 ← phi( @8/(byte[256]) buffer2#5 flip/(byte[256]) buffer2#6 ) + (byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) flip::dstIdx#0 ) (byte) flip::c#0 ← (byte) 16 to:flip::@2 flip::@2: from flip::@1 flip::@2 @@ -624,43 +668,43 @@ flip::@2: from flip::@1 flip::@2 (byte) flip::c#1 ← -- (byte) flip::c#2 (boolean~) flip::$2 ← (byte) flip::c#1 != (byte) 0 if((boolean~) flip::$2) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte[256]) buffer2#5 ← phi( flip::@2/(byte[256]) buffer2#1 ) (byte) flip::srcIdx#4 ← phi( flip::@2/(byte) flip::srcIdx#1 ) - (byte[256]) buffer1#9 ← phi( flip::@2/(byte[256]) buffer1#2 ) + (byte[256]) buffer1#10 ← phi( flip::@2/(byte[256]) buffer1#2 ) (byte) flip::r#2 ← phi( flip::@2/(byte) flip::r#3 ) (byte) flip::dstIdx#4 ← phi( flip::@2/(byte) flip::dstIdx#1 ) (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#4 (byte) flip::r#1 ← -- (byte) flip::r#2 (boolean~) flip::$3 ← (byte) flip::r#1 != (byte) 0 if((boolean~) flip::$3) goto flip::@1 - to:@12 -@12: from @11 - (byte[256]) buffer2#4 ← phi( @11/(byte[256]) buffer2#5 ) - (byte[256]) buffer1#7 ← phi( @11/(byte[256]) buffer1#9 ) + to:@9 +@9: from @8 + (byte[256]) buffer2#4 ← phi( @8/(byte[256]) buffer2#5 ) + (byte[256]) buffer1#7 ← phi( @8/(byte[256]) buffer1#10 ) (byte) flip::i#0 ← (byte) 0 to:flip::@3 -flip::@3: from @12 flip::@3 - (byte[256]) buffer1#3 ← phi( @12/(byte[256]) buffer1#7 flip::@3/(byte[256]) buffer1#3 ) - (byte) flip::i#2 ← phi( @12/(byte) flip::i#0 flip::@3/(byte) flip::i#1 ) - (byte[256]) buffer2#2 ← phi( @12/(byte[256]) buffer2#4 flip::@3/(byte[256]) buffer2#2 ) +flip::@3: from @9 flip::@3 + (byte[256]) buffer1#3 ← phi( @9/(byte[256]) buffer1#7 flip::@3/(byte[256]) buffer1#3 ) + (byte) flip::i#2 ← phi( @9/(byte) flip::i#0 flip::@3/(byte) flip::i#1 ) + (byte[256]) buffer2#2 ← phi( @9/(byte[256]) buffer2#4 flip::@3/(byte[256]) buffer2#2 ) (byte~) flip::$4 ← (byte[256]) buffer2#2 *idx (byte) flip::i#2 *((byte[256]) buffer1#3 + (byte) flip::i#2) ← (byte~) flip::$4 (byte) flip::i#1 ← ++ (byte) flip::i#2 (boolean~) flip::$5 ← (byte) flip::i#1 != (byte) 0 if((boolean~) flip::$5) goto flip::@3 - to:@13 -@13: from flip::@3 + to:@10 +@10: from flip::@3 to:flip::@return -flip::@return: from @13 +flip::@return: from @10 return to:@RETURN -@14: from @10 - to:@17 -plot: from @19 - (byte[256]) buffer1#12 ← phi( @19/(byte[256]) buffer1#14 ) - (byte[1000]) SCREEN#1 ← phi( @19/(byte[1000]) SCREEN#2 ) +@11: from @7 + to:@14 +plot: from @17 + (byte[256]) buffer1#13 ← phi( @17/(byte[256]) buffer1#15 ) + (byte[1000]) SCREEN#1 ← phi( @17/(byte[1000]) SCREEN#2 ) (byte~) plot::$0 ← (byte) 5 * (byte) 40 (byte*~) plot::$1 ← (byte[1000]) SCREEN#1 + (byte~) plot::$0 (byte*~) plot::$2 ← (byte*~) plot::$1 + (byte) 12 @@ -668,11 +712,11 @@ plot: from @19 (byte) plot::y#0 ← (byte) 16 (byte) plot::i#0 ← (byte) 0 to:plot::@1 -plot::@1: from @15 plot - (byte) plot::y#4 ← phi( @15/(byte) plot::y#1 plot/(byte) plot::y#0 ) - (byte[256]) buffer1#8 ← phi( @15/(byte[256]) buffer1#11 plot/(byte[256]) buffer1#12 ) - (byte) plot::i#3 ← phi( @15/(byte) plot::i#4 plot/(byte) plot::i#0 ) - (byte*) plot::line#4 ← phi( @15/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) +plot::@1: from @12 plot + (byte) plot::y#4 ← phi( @12/(byte) plot::y#1 plot/(byte) plot::y#0 ) + (byte[256]) buffer1#8 ← phi( @12/(byte[256]) buffer1#12 plot/(byte[256]) buffer1#13 ) + (byte) plot::i#3 ← phi( @12/(byte) plot::i#4 plot/(byte) plot::i#0 ) + (byte*) plot::line#4 ← phi( @12/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) (byte) plot::x#0 ← (byte) 0 to:plot::@2 plot::@2: from plot::@1 plot::@2 @@ -687,10 +731,10 @@ plot::@2: from plot::@1 plot::@2 (byte) plot::x#1 ← ++ (byte) plot::x#2 (boolean~) plot::$4 ← (byte) plot::x#1 < (byte) 16 if((boolean~) plot::$4) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte) plot::i#4 ← phi( plot::@2/(byte) plot::i#1 ) - (byte[256]) buffer1#11 ← phi( plot::@2/(byte[256]) buffer1#4 ) + (byte[256]) buffer1#12 ← phi( plot::@2/(byte[256]) buffer1#4 ) (byte) plot::y#2 ← phi( plot::@2/(byte) plot::y#3 ) (byte*) plot::line#3 ← phi( plot::@2/(byte*) plot::line#2 ) (byte*~) plot::$5 ← (byte*) plot::line#3 + (byte) 40 @@ -698,15 +742,15 @@ plot::@2: from plot::@1 plot::@2 (byte) plot::y#1 ← -- (byte) plot::y#2 (boolean~) plot::$6 ← (byte) plot::y#1 != (byte) 0 if((boolean~) plot::$6) goto plot::@1 - to:@16 -@16: from @15 + to:@13 +@13: from @12 to:plot::@return -plot::@return: from @16 +plot::@return: from @13 return to:@RETURN -@17: from @14 +@14: from @11 to:@END -@END: from @17 +@END: from @14 CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN @BEGIN: from @@ -714,90 +758,104 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN (byte[256]) buffer1#0 ← (word) 4096 (byte[256]) buffer2#0 ← (word) 4352 (byte*) RASTER#0 ← (word) 53266 - call prepare param-assignment - to:@18 -@18: from @BEGIN - (byte[256]) buffer2#14 ← phi( @BEGIN/(byte[256]) buffer2#0 ) - (byte[256]) buffer1#21 ← phi( @BEGIN/(byte[256]) buffer1#0 ) - (byte[1000]) SCREEN#10 ← phi( @BEGIN/(byte[1000]) SCREEN#0 ) - (byte*) RASTER#7 ← phi( @BEGIN/(byte*) RASTER#0 ) - to:@1 -@1: from @18 @20 - (byte[256]) buffer1#20 ← phi( @18/(byte[256]) buffer1#21 @20/(byte[256]) buffer1#22 ) - (byte[256]) buffer2#13 ← phi( @18/(byte[256]) buffer2#14 @20/(byte[256]) buffer2#15 ) - (byte[1000]) SCREEN#9 ← phi( @18/(byte[1000]) SCREEN#10 @20/(byte[1000]) SCREEN#11 ) - (byte*) RASTER#5 ← phi( @18/(byte*) RASTER#7 @20/(byte*) RASTER#8 ) - (byte) c#0 ← (byte) 25 - to:@2 -@2: from @1 @6 - (byte[256]) buffer2#12 ← phi( @1/(byte[256]) buffer2#13 @6/(byte[256]) buffer2#8 ) - (byte[256]) buffer1#19 ← phi( @1/(byte[256]) buffer1#20 @6/(byte[256]) buffer1#15 ) - (byte[1000]) SCREEN#8 ← phi( @1/(byte[1000]) SCREEN#9 @6/(byte[1000]) SCREEN#4 ) - (byte) c#6 ← phi( @1/(byte) c#0 @6/(byte) c#1 ) - (byte*) RASTER#3 ← phi( @1/(byte*) RASTER#5 @6/(byte*) RASTER#6 ) - to:@3 -@3: from @2 @3 - (byte[256]) buffer1#18 ← phi( @2/(byte[256]) buffer1#19 @3/(byte[256]) buffer1#18 ) - (byte[256]) buffer2#11 ← phi( @2/(byte[256]) buffer2#12 @3/(byte[256]) buffer2#11 ) - (byte[1000]) SCREEN#7 ← phi( @2/(byte[1000]) SCREEN#8 @3/(byte[1000]) SCREEN#7 ) - (byte) c#5 ← phi( @2/(byte) c#6 @3/(byte) c#5 ) - (byte*) RASTER#1 ← phi( @2/(byte*) RASTER#3 @3/(byte*) RASTER#1 ) - (byte~) $1 ← * (byte*) RASTER#1 - (boolean~) $2 ← (byte~) $1 != (byte) 254 - if((boolean~) $2) goto @3 + call main param-assignment + to:@15 +@15: from @BEGIN to:@5 -@5: from @3 - (byte[256]) buffer2#10 ← phi( @3/(byte[256]) buffer2#11 ) - (byte[256]) buffer1#17 ← phi( @3/(byte[256]) buffer1#18 ) - (byte[1000]) SCREEN#6 ← phi( @3/(byte[1000]) SCREEN#7 ) - (byte) c#4 ← phi( @3/(byte) c#5 ) - (byte*) RASTER#4 ← phi( @3/(byte*) RASTER#1 ) - to:@4 -@4: from @4 @5 - (byte[256]) buffer1#16 ← phi( @4/(byte[256]) buffer1#16 @5/(byte[256]) buffer1#17 ) - (byte[256]) buffer2#9 ← phi( @4/(byte[256]) buffer2#9 @5/(byte[256]) buffer2#10 ) - (byte[1000]) SCREEN#5 ← phi( @4/(byte[1000]) SCREEN#5 @5/(byte[1000]) SCREEN#6 ) - (byte) c#3 ← phi( @4/(byte) c#3 @5/(byte) c#4 ) - (byte*) RASTER#2 ← phi( @4/(byte*) RASTER#2 @5/(byte*) RASTER#4 ) - (byte~) $3 ← * (byte*) RASTER#2 - (boolean~) $4 ← (byte~) $3 != (byte) 255 - if((boolean~) $4) goto @4 - to:@6 -@6: from @4 - (byte[256]) buffer2#8 ← phi( @4/(byte[256]) buffer2#9 ) - (byte[256]) buffer1#15 ← phi( @4/(byte[256]) buffer1#16 ) - (byte[1000]) SCREEN#4 ← phi( @4/(byte[1000]) SCREEN#5 ) - (byte*) RASTER#6 ← phi( @4/(byte*) RASTER#2 ) - (byte) c#2 ← phi( @4/(byte) c#3 ) - (byte) c#1 ← -- (byte) c#2 - (boolean~) $5 ← (byte) c#1 != (byte) 0 - if((boolean~) $5) goto @2 - to:@7 -@7: from @6 - (byte*) RASTER#10 ← phi( @6/(byte*) RASTER#6 ) - (byte[256]) buffer1#13 ← phi( @6/(byte[256]) buffer1#15 ) - (byte[256]) buffer2#7 ← phi( @6/(byte[256]) buffer2#8 ) - (byte[1000]) SCREEN#3 ← phi( @6/(byte[1000]) SCREEN#4 ) +main: from @BEGIN + (byte[256]) buffer2#16 ← phi( @BEGIN/(byte[256]) buffer2#0 ) + (byte[1000]) SCREEN#12 ← phi( @BEGIN/(byte[1000]) SCREEN#0 ) + (byte*) RASTER#9 ← phi( @BEGIN/(byte*) RASTER#0 ) + (byte[256]) buffer1#9 ← phi( @BEGIN/(byte[256]) buffer1#0 ) + call prepare param-assignment + to:@16 +@16: from main + (byte[256]) buffer2#14 ← phi( main/(byte[256]) buffer2#16 ) + (byte[256]) buffer1#22 ← phi( main/(byte[256]) buffer1#9 ) + (byte[1000]) SCREEN#10 ← phi( main/(byte[1000]) SCREEN#12 ) + (byte*) RASTER#7 ← phi( main/(byte*) RASTER#9 ) + to:main::@1 +main::@1: from @16 @18 + (byte[256]) buffer1#21 ← phi( @16/(byte[256]) buffer1#22 @18/(byte[256]) buffer1#23 ) + (byte[256]) buffer2#13 ← phi( @16/(byte[256]) buffer2#14 @18/(byte[256]) buffer2#15 ) + (byte[1000]) SCREEN#9 ← phi( @16/(byte[1000]) SCREEN#10 @18/(byte[1000]) SCREEN#11 ) + (byte*) RASTER#6 ← phi( @16/(byte*) RASTER#7 @18/(byte*) RASTER#8 ) + (byte) main::c#0 ← (byte) 25 + to:main::@2 +main::@2: from @2 main::@1 + (byte[256]) buffer2#12 ← phi( @2/(byte[256]) buffer2#8 main::@1/(byte[256]) buffer2#13 ) + (byte[256]) buffer1#20 ← phi( @2/(byte[256]) buffer1#16 main::@1/(byte[256]) buffer1#21 ) + (byte[1000]) SCREEN#8 ← phi( @2/(byte[1000]) SCREEN#4 main::@1/(byte[1000]) SCREEN#9 ) + (byte) main::c#6 ← phi( @2/(byte) main::c#1 main::@1/(byte) main::c#0 ) + (byte*) RASTER#3 ← phi( @2/(byte*) RASTER#5 main::@1/(byte*) RASTER#6 ) + to:main::@3 +main::@3: from main::@2 main::@3 + (byte[256]) buffer1#19 ← phi( main::@2/(byte[256]) buffer1#20 main::@3/(byte[256]) buffer1#19 ) + (byte[256]) buffer2#11 ← phi( main::@2/(byte[256]) buffer2#12 main::@3/(byte[256]) buffer2#11 ) + (byte[1000]) SCREEN#7 ← phi( main::@2/(byte[1000]) SCREEN#8 main::@3/(byte[1000]) SCREEN#7 ) + (byte) main::c#5 ← phi( main::@2/(byte) main::c#6 main::@3/(byte) main::c#5 ) + (byte*) RASTER#1 ← phi( main::@2/(byte*) RASTER#3 main::@3/(byte*) RASTER#1 ) + (byte~) main::$1 ← * (byte*) RASTER#1 + (boolean~) main::$2 ← (byte~) main::$1 != (byte) 254 + if((boolean~) main::$2) goto main::@3 + to:@1 +@1: from main::@3 + (byte[256]) buffer2#10 ← phi( main::@3/(byte[256]) buffer2#11 ) + (byte[256]) buffer1#18 ← phi( main::@3/(byte[256]) buffer1#19 ) + (byte[1000]) SCREEN#6 ← phi( main::@3/(byte[1000]) SCREEN#7 ) + (byte) main::c#4 ← phi( main::@3/(byte) main::c#5 ) + (byte*) RASTER#4 ← phi( main::@3/(byte*) RASTER#1 ) + to:main::@4 +main::@4: from @1 main::@4 + (byte[256]) buffer1#17 ← phi( @1/(byte[256]) buffer1#18 main::@4/(byte[256]) buffer1#17 ) + (byte[256]) buffer2#9 ← phi( @1/(byte[256]) buffer2#10 main::@4/(byte[256]) buffer2#9 ) + (byte[1000]) SCREEN#5 ← phi( @1/(byte[1000]) SCREEN#6 main::@4/(byte[1000]) SCREEN#5 ) + (byte) main::c#3 ← phi( @1/(byte) main::c#4 main::@4/(byte) main::c#3 ) + (byte*) RASTER#2 ← phi( @1/(byte*) RASTER#4 main::@4/(byte*) RASTER#2 ) + (byte~) main::$3 ← * (byte*) RASTER#2 + (boolean~) main::$4 ← (byte~) main::$3 != (byte) 255 + if((boolean~) main::$4) goto main::@4 + to:@2 +@2: from main::@4 + (byte[256]) buffer2#8 ← phi( main::@4/(byte[256]) buffer2#9 ) + (byte[256]) buffer1#16 ← phi( main::@4/(byte[256]) buffer1#17 ) + (byte[1000]) SCREEN#4 ← phi( main::@4/(byte[1000]) SCREEN#5 ) + (byte*) RASTER#5 ← phi( main::@4/(byte*) RASTER#2 ) + (byte) main::c#2 ← phi( main::@4/(byte) main::c#3 ) + (byte) main::c#1 ← -- (byte) main::c#2 + (boolean~) main::$5 ← (byte) main::c#1 != (byte) 0 + if((boolean~) main::$5) goto main::@2 + to:@3 +@3: from @2 + (byte*) RASTER#11 ← phi( @2/(byte*) RASTER#5 ) + (byte[256]) buffer1#14 ← phi( @2/(byte[256]) buffer1#16 ) + (byte[256]) buffer2#7 ← phi( @2/(byte[256]) buffer2#8 ) + (byte[1000]) SCREEN#3 ← phi( @2/(byte[1000]) SCREEN#4 ) call flip param-assignment - to:@19 -@19: from @7 - (byte[256]) buffer2#16 ← phi( @7/(byte[256]) buffer2#7 ) - (byte*) RASTER#9 ← phi( @7/(byte*) RASTER#10 ) - (byte[256]) buffer1#14 ← phi( @7/(byte[256]) buffer1#13 ) - (byte[1000]) SCREEN#2 ← phi( @7/(byte[1000]) SCREEN#3 ) + to:@17 +@17: from @3 + (byte[256]) buffer2#17 ← phi( @3/(byte[256]) buffer2#7 ) + (byte*) RASTER#10 ← phi( @3/(byte*) RASTER#11 ) + (byte[256]) buffer1#15 ← phi( @3/(byte[256]) buffer1#14 ) + (byte[1000]) SCREEN#2 ← phi( @3/(byte[1000]) SCREEN#3 ) call plot param-assignment - to:@20 -@20: from @19 - (byte[256]) buffer2#15 ← phi( @19/(byte[256]) buffer2#16 ) - (byte[256]) buffer1#22 ← phi( @19/(byte[256]) buffer1#14 ) - (byte[1000]) SCREEN#11 ← phi( @19/(byte[1000]) SCREEN#2 ) - (byte*) RASTER#8 ← phi( @19/(byte*) RASTER#9 ) - if(true) goto @1 - to:@8 -@8: from @20 - to:@10 -prepare: from @BEGIN - (byte[256]) buffer1#5 ← phi( @BEGIN/(byte[256]) buffer1#0 ) + to:@18 +@18: from @17 + (byte[256]) buffer2#15 ← phi( @17/(byte[256]) buffer2#17 ) + (byte[256]) buffer1#23 ← phi( @17/(byte[256]) buffer1#15 ) + (byte[1000]) SCREEN#11 ← phi( @17/(byte[1000]) SCREEN#2 ) + (byte*) RASTER#8 ← phi( @17/(byte*) RASTER#10 ) + if(true) goto main::@1 + to:@4 +@4: from @18 + to:main::@return +main::@return: from @4 + return + to:@RETURN +@5: from @15 + to:@7 +prepare: from main + (byte[256]) buffer1#5 ← phi( main/(byte[256]) buffer1#9 ) (byte) prepare::i#0 ← (byte) 0 to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -807,27 +865,27 @@ prepare::@1: from prepare prepare::@1 (byte) prepare::i#1 ← ++ (byte) prepare::i#2 (boolean~) prepare::$0 ← (byte) prepare::i#1 != (byte) 0 if((boolean~) prepare::$0) goto prepare::@1 - to:@9 -@9: from prepare::@1 + to:@6 +@6: from prepare::@1 to:prepare::@return -prepare::@return: from @9 +prepare::@return: from @6 return to:@RETURN -@10: from @8 - to:@14 -flip: from @7 - (byte[256]) buffer2#6 ← phi( @7/(byte[256]) buffer2#7 ) - (byte[256]) buffer1#10 ← phi( @7/(byte[256]) buffer1#13 ) +@7: from @5 + to:@11 +flip: from @3 + (byte[256]) buffer2#6 ← phi( @3/(byte[256]) buffer2#7 ) + (byte[256]) buffer1#11 ← phi( @3/(byte[256]) buffer1#14 ) (byte) flip::srcIdx#0 ← (byte) 0 (byte) flip::dstIdx#0 ← (byte) 15 (byte) flip::r#0 ← (byte) 16 to:flip::@1 -flip::@1: from @11 flip - (byte) flip::r#4 ← phi( @11/(byte) flip::r#1 flip/(byte) flip::r#0 ) - (byte[256]) buffer1#6 ← phi( @11/(byte[256]) buffer1#9 flip/(byte[256]) buffer1#10 ) - (byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#4 flip/(byte) flip::srcIdx#0 ) - (byte[256]) buffer2#3 ← phi( @11/(byte[256]) buffer2#5 flip/(byte[256]) buffer2#6 ) - (byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) flip::dstIdx#0 ) +flip::@1: from @8 flip + (byte) flip::r#4 ← phi( @8/(byte) flip::r#1 flip/(byte) flip::r#0 ) + (byte[256]) buffer1#6 ← phi( @8/(byte[256]) buffer1#10 flip/(byte[256]) buffer1#11 ) + (byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#4 flip/(byte) flip::srcIdx#0 ) + (byte[256]) buffer2#3 ← phi( @8/(byte[256]) buffer2#5 flip/(byte[256]) buffer2#6 ) + (byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) flip::dstIdx#0 ) (byte) flip::c#0 ← (byte) 16 to:flip::@2 flip::@2: from flip::@1 flip::@2 @@ -845,43 +903,43 @@ flip::@2: from flip::@1 flip::@2 (byte) flip::c#1 ← -- (byte) flip::c#2 (boolean~) flip::$2 ← (byte) flip::c#1 != (byte) 0 if((boolean~) flip::$2) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte[256]) buffer2#5 ← phi( flip::@2/(byte[256]) buffer2#1 ) (byte) flip::srcIdx#4 ← phi( flip::@2/(byte) flip::srcIdx#1 ) - (byte[256]) buffer1#9 ← phi( flip::@2/(byte[256]) buffer1#2 ) + (byte[256]) buffer1#10 ← phi( flip::@2/(byte[256]) buffer1#2 ) (byte) flip::r#2 ← phi( flip::@2/(byte) flip::r#3 ) (byte) flip::dstIdx#4 ← phi( flip::@2/(byte) flip::dstIdx#1 ) (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#4 (byte) flip::r#1 ← -- (byte) flip::r#2 (boolean~) flip::$3 ← (byte) flip::r#1 != (byte) 0 if((boolean~) flip::$3) goto flip::@1 - to:@12 -@12: from @11 - (byte[256]) buffer2#4 ← phi( @11/(byte[256]) buffer2#5 ) - (byte[256]) buffer1#7 ← phi( @11/(byte[256]) buffer1#9 ) + to:@9 +@9: from @8 + (byte[256]) buffer2#4 ← phi( @8/(byte[256]) buffer2#5 ) + (byte[256]) buffer1#7 ← phi( @8/(byte[256]) buffer1#10 ) (byte) flip::i#0 ← (byte) 0 to:flip::@3 -flip::@3: from @12 flip::@3 - (byte[256]) buffer1#3 ← phi( @12/(byte[256]) buffer1#7 flip::@3/(byte[256]) buffer1#3 ) - (byte) flip::i#2 ← phi( @12/(byte) flip::i#0 flip::@3/(byte) flip::i#1 ) - (byte[256]) buffer2#2 ← phi( @12/(byte[256]) buffer2#4 flip::@3/(byte[256]) buffer2#2 ) +flip::@3: from @9 flip::@3 + (byte[256]) buffer1#3 ← phi( @9/(byte[256]) buffer1#7 flip::@3/(byte[256]) buffer1#3 ) + (byte) flip::i#2 ← phi( @9/(byte) flip::i#0 flip::@3/(byte) flip::i#1 ) + (byte[256]) buffer2#2 ← phi( @9/(byte[256]) buffer2#4 flip::@3/(byte[256]) buffer2#2 ) (byte~) flip::$4 ← (byte[256]) buffer2#2 *idx (byte) flip::i#2 *((byte[256]) buffer1#3 + (byte) flip::i#2) ← (byte~) flip::$4 (byte) flip::i#1 ← ++ (byte) flip::i#2 (boolean~) flip::$5 ← (byte) flip::i#1 != (byte) 0 if((boolean~) flip::$5) goto flip::@3 - to:@13 -@13: from flip::@3 + to:@10 +@10: from flip::@3 to:flip::@return -flip::@return: from @13 +flip::@return: from @10 return to:@RETURN -@14: from @10 - to:@17 -plot: from @19 - (byte[256]) buffer1#12 ← phi( @19/(byte[256]) buffer1#14 ) - (byte[1000]) SCREEN#1 ← phi( @19/(byte[1000]) SCREEN#2 ) +@11: from @7 + to:@14 +plot: from @17 + (byte[256]) buffer1#13 ← phi( @17/(byte[256]) buffer1#15 ) + (byte[1000]) SCREEN#1 ← phi( @17/(byte[1000]) SCREEN#2 ) (byte~) plot::$0 ← (byte) 5 * (byte) 40 (byte*~) plot::$1 ← (byte[1000]) SCREEN#1 + (byte~) plot::$0 (byte*~) plot::$2 ← (byte*~) plot::$1 + (byte) 12 @@ -889,11 +947,11 @@ plot: from @19 (byte) plot::y#0 ← (byte) 16 (byte) plot::i#0 ← (byte) 0 to:plot::@1 -plot::@1: from @15 plot - (byte) plot::y#4 ← phi( @15/(byte) plot::y#1 plot/(byte) plot::y#0 ) - (byte[256]) buffer1#8 ← phi( @15/(byte[256]) buffer1#11 plot/(byte[256]) buffer1#12 ) - (byte) plot::i#3 ← phi( @15/(byte) plot::i#4 plot/(byte) plot::i#0 ) - (byte*) plot::line#4 ← phi( @15/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) +plot::@1: from @12 plot + (byte) plot::y#4 ← phi( @12/(byte) plot::y#1 plot/(byte) plot::y#0 ) + (byte[256]) buffer1#8 ← phi( @12/(byte[256]) buffer1#12 plot/(byte[256]) buffer1#13 ) + (byte) plot::i#3 ← phi( @12/(byte) plot::i#4 plot/(byte) plot::i#0 ) + (byte*) plot::line#4 ← phi( @12/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) (byte) plot::x#0 ← (byte) 0 to:plot::@2 plot::@2: from plot::@1 plot::@2 @@ -908,10 +966,10 @@ plot::@2: from plot::@1 plot::@2 (byte) plot::x#1 ← ++ (byte) plot::x#2 (boolean~) plot::$4 ← (byte) plot::x#1 < (byte) 16 if((boolean~) plot::$4) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte) plot::i#4 ← phi( plot::@2/(byte) plot::i#1 ) - (byte[256]) buffer1#11 ← phi( plot::@2/(byte[256]) buffer1#4 ) + (byte[256]) buffer1#12 ← phi( plot::@2/(byte[256]) buffer1#4 ) (byte) plot::y#2 ← phi( plot::@2/(byte) plot::y#3 ) (byte*) plot::line#3 ← phi( plot::@2/(byte*) plot::line#2 ) (byte*~) plot::$5 ← (byte*) plot::line#3 + (byte) 40 @@ -919,23 +977,25 @@ plot::@2: from plot::@1 plot::@2 (byte) plot::y#1 ← -- (byte) plot::y#2 (boolean~) plot::$6 ← (byte) plot::y#1 != (byte) 0 if((boolean~) plot::$6) goto plot::@1 - to:@16 -@16: from @15 + to:@13 +@13: from @12 to:plot::@return -plot::@return: from @16 +plot::@return: from @13 return to:@RETURN -@17: from @14 +@14: from @11 to:@END -@END: from @17 +@END: from @14 -Culled Empty Block (label) @8 -Culled Empty Block (label) @9 +Culled Empty Block (label) @15 +Culled Empty Block (label) @4 +Culled Empty Block (label) @5 +Culled Empty Block (label) @6 +Culled Empty Block (label) @7 Culled Empty Block (label) @10 +Culled Empty Block (label) @11 Culled Empty Block (label) @13 Culled Empty Block (label) @14 -Culled Empty Block (label) @16 -Culled Empty Block (label) @17 Succesful SSA optimization Pass2CullEmptyBlocks CONTROL FLOW GRAPH @BEGIN: from @@ -943,88 +1003,98 @@ CONTROL FLOW GRAPH (byte[256]) buffer1#0 ← (word) 4096 (byte[256]) buffer2#0 ← (word) 4352 (byte*) RASTER#0 ← (word) 53266 - call prepare param-assignment - to:@18 -@18: from @BEGIN - (byte[256]) buffer2#14 ← phi( @BEGIN/(byte[256]) buffer2#0 ) - (byte[256]) buffer1#21 ← phi( @BEGIN/(byte[256]) buffer1#0 ) - (byte[1000]) SCREEN#10 ← phi( @BEGIN/(byte[1000]) SCREEN#0 ) - (byte*) RASTER#7 ← phi( @BEGIN/(byte*) RASTER#0 ) - to:@1 -@1: from @18 @20 - (byte[256]) buffer1#20 ← phi( @18/(byte[256]) buffer1#21 @20/(byte[256]) buffer1#22 ) - (byte[256]) buffer2#13 ← phi( @18/(byte[256]) buffer2#14 @20/(byte[256]) buffer2#15 ) - (byte[1000]) SCREEN#9 ← phi( @18/(byte[1000]) SCREEN#10 @20/(byte[1000]) SCREEN#11 ) - (byte*) RASTER#5 ← phi( @18/(byte*) RASTER#7 @20/(byte*) RASTER#8 ) - (byte) c#0 ← (byte) 25 - to:@2 -@2: from @1 @6 - (byte[256]) buffer2#12 ← phi( @1/(byte[256]) buffer2#13 @6/(byte[256]) buffer2#8 ) - (byte[256]) buffer1#19 ← phi( @1/(byte[256]) buffer1#20 @6/(byte[256]) buffer1#15 ) - (byte[1000]) SCREEN#8 ← phi( @1/(byte[1000]) SCREEN#9 @6/(byte[1000]) SCREEN#4 ) - (byte) c#6 ← phi( @1/(byte) c#0 @6/(byte) c#1 ) - (byte*) RASTER#3 ← phi( @1/(byte*) RASTER#5 @6/(byte*) RASTER#6 ) - to:@3 -@3: from @2 @3 - (byte[256]) buffer1#18 ← phi( @2/(byte[256]) buffer1#19 @3/(byte[256]) buffer1#18 ) - (byte[256]) buffer2#11 ← phi( @2/(byte[256]) buffer2#12 @3/(byte[256]) buffer2#11 ) - (byte[1000]) SCREEN#7 ← phi( @2/(byte[1000]) SCREEN#8 @3/(byte[1000]) SCREEN#7 ) - (byte) c#5 ← phi( @2/(byte) c#6 @3/(byte) c#5 ) - (byte*) RASTER#1 ← phi( @2/(byte*) RASTER#3 @3/(byte*) RASTER#1 ) - (byte~) $1 ← * (byte*) RASTER#1 - (boolean~) $2 ← (byte~) $1 != (byte) 254 - if((boolean~) $2) goto @3 - to:@5 -@5: from @3 - (byte[256]) buffer2#10 ← phi( @3/(byte[256]) buffer2#11 ) - (byte[256]) buffer1#17 ← phi( @3/(byte[256]) buffer1#18 ) - (byte[1000]) SCREEN#6 ← phi( @3/(byte[1000]) SCREEN#7 ) - (byte) c#4 ← phi( @3/(byte) c#5 ) - (byte*) RASTER#4 ← phi( @3/(byte*) RASTER#1 ) - to:@4 -@4: from @4 @5 - (byte[256]) buffer1#16 ← phi( @4/(byte[256]) buffer1#16 @5/(byte[256]) buffer1#17 ) - (byte[256]) buffer2#9 ← phi( @4/(byte[256]) buffer2#9 @5/(byte[256]) buffer2#10 ) - (byte[1000]) SCREEN#5 ← phi( @4/(byte[1000]) SCREEN#5 @5/(byte[1000]) SCREEN#6 ) - (byte) c#3 ← phi( @4/(byte) c#3 @5/(byte) c#4 ) - (byte*) RASTER#2 ← phi( @4/(byte*) RASTER#2 @5/(byte*) RASTER#4 ) - (byte~) $3 ← * (byte*) RASTER#2 - (boolean~) $4 ← (byte~) $3 != (byte) 255 - if((boolean~) $4) goto @4 - to:@6 -@6: from @4 - (byte[256]) buffer2#8 ← phi( @4/(byte[256]) buffer2#9 ) - (byte[256]) buffer1#15 ← phi( @4/(byte[256]) buffer1#16 ) - (byte[1000]) SCREEN#4 ← phi( @4/(byte[1000]) SCREEN#5 ) - (byte*) RASTER#6 ← phi( @4/(byte*) RASTER#2 ) - (byte) c#2 ← phi( @4/(byte) c#3 ) - (byte) c#1 ← -- (byte) c#2 - (boolean~) $5 ← (byte) c#1 != (byte) 0 - if((boolean~) $5) goto @2 - to:@7 -@7: from @6 - (byte*) RASTER#10 ← phi( @6/(byte*) RASTER#6 ) - (byte[256]) buffer1#13 ← phi( @6/(byte[256]) buffer1#15 ) - (byte[256]) buffer2#7 ← phi( @6/(byte[256]) buffer2#8 ) - (byte[1000]) SCREEN#3 ← phi( @6/(byte[1000]) SCREEN#4 ) - call flip param-assignment - to:@19 -@19: from @7 - (byte[256]) buffer2#16 ← phi( @7/(byte[256]) buffer2#7 ) - (byte*) RASTER#9 ← phi( @7/(byte*) RASTER#10 ) - (byte[256]) buffer1#14 ← phi( @7/(byte[256]) buffer1#13 ) - (byte[1000]) SCREEN#2 ← phi( @7/(byte[1000]) SCREEN#3 ) - call plot param-assignment - to:@20 -@20: from @19 - (byte[256]) buffer2#15 ← phi( @19/(byte[256]) buffer2#16 ) - (byte[256]) buffer1#22 ← phi( @19/(byte[256]) buffer1#14 ) - (byte[1000]) SCREEN#11 ← phi( @19/(byte[1000]) SCREEN#2 ) - (byte*) RASTER#8 ← phi( @19/(byte*) RASTER#9 ) - if(true) goto @1 + call main param-assignment to:@END -prepare: from @BEGIN - (byte[256]) buffer1#5 ← phi( @BEGIN/(byte[256]) buffer1#0 ) +main: from @BEGIN + (byte[256]) buffer2#16 ← phi( @BEGIN/(byte[256]) buffer2#0 ) + (byte[1000]) SCREEN#12 ← phi( @BEGIN/(byte[1000]) SCREEN#0 ) + (byte*) RASTER#9 ← phi( @BEGIN/(byte*) RASTER#0 ) + (byte[256]) buffer1#9 ← phi( @BEGIN/(byte[256]) buffer1#0 ) + call prepare param-assignment + to:@16 +@16: from main + (byte[256]) buffer2#14 ← phi( main/(byte[256]) buffer2#16 ) + (byte[256]) buffer1#22 ← phi( main/(byte[256]) buffer1#9 ) + (byte[1000]) SCREEN#10 ← phi( main/(byte[1000]) SCREEN#12 ) + (byte*) RASTER#7 ← phi( main/(byte*) RASTER#9 ) + to:main::@1 +main::@1: from @16 @18 + (byte[256]) buffer1#21 ← phi( @16/(byte[256]) buffer1#22 @18/(byte[256]) buffer1#23 ) + (byte[256]) buffer2#13 ← phi( @16/(byte[256]) buffer2#14 @18/(byte[256]) buffer2#15 ) + (byte[1000]) SCREEN#9 ← phi( @16/(byte[1000]) SCREEN#10 @18/(byte[1000]) SCREEN#11 ) + (byte*) RASTER#6 ← phi( @16/(byte*) RASTER#7 @18/(byte*) RASTER#8 ) + (byte) main::c#0 ← (byte) 25 + to:main::@2 +main::@2: from @2 main::@1 + (byte[256]) buffer2#12 ← phi( @2/(byte[256]) buffer2#8 main::@1/(byte[256]) buffer2#13 ) + (byte[256]) buffer1#20 ← phi( @2/(byte[256]) buffer1#16 main::@1/(byte[256]) buffer1#21 ) + (byte[1000]) SCREEN#8 ← phi( @2/(byte[1000]) SCREEN#4 main::@1/(byte[1000]) SCREEN#9 ) + (byte) main::c#6 ← phi( @2/(byte) main::c#1 main::@1/(byte) main::c#0 ) + (byte*) RASTER#3 ← phi( @2/(byte*) RASTER#5 main::@1/(byte*) RASTER#6 ) + to:main::@3 +main::@3: from main::@2 main::@3 + (byte[256]) buffer1#19 ← phi( main::@2/(byte[256]) buffer1#20 main::@3/(byte[256]) buffer1#19 ) + (byte[256]) buffer2#11 ← phi( main::@2/(byte[256]) buffer2#12 main::@3/(byte[256]) buffer2#11 ) + (byte[1000]) SCREEN#7 ← phi( main::@2/(byte[1000]) SCREEN#8 main::@3/(byte[1000]) SCREEN#7 ) + (byte) main::c#5 ← phi( main::@2/(byte) main::c#6 main::@3/(byte) main::c#5 ) + (byte*) RASTER#1 ← phi( main::@2/(byte*) RASTER#3 main::@3/(byte*) RASTER#1 ) + (byte~) main::$1 ← * (byte*) RASTER#1 + (boolean~) main::$2 ← (byte~) main::$1 != (byte) 254 + if((boolean~) main::$2) goto main::@3 + to:@1 +@1: from main::@3 + (byte[256]) buffer2#10 ← phi( main::@3/(byte[256]) buffer2#11 ) + (byte[256]) buffer1#18 ← phi( main::@3/(byte[256]) buffer1#19 ) + (byte[1000]) SCREEN#6 ← phi( main::@3/(byte[1000]) SCREEN#7 ) + (byte) main::c#4 ← phi( main::@3/(byte) main::c#5 ) + (byte*) RASTER#4 ← phi( main::@3/(byte*) RASTER#1 ) + to:main::@4 +main::@4: from @1 main::@4 + (byte[256]) buffer1#17 ← phi( @1/(byte[256]) buffer1#18 main::@4/(byte[256]) buffer1#17 ) + (byte[256]) buffer2#9 ← phi( @1/(byte[256]) buffer2#10 main::@4/(byte[256]) buffer2#9 ) + (byte[1000]) SCREEN#5 ← phi( @1/(byte[1000]) SCREEN#6 main::@4/(byte[1000]) SCREEN#5 ) + (byte) main::c#3 ← phi( @1/(byte) main::c#4 main::@4/(byte) main::c#3 ) + (byte*) RASTER#2 ← phi( @1/(byte*) RASTER#4 main::@4/(byte*) RASTER#2 ) + (byte~) main::$3 ← * (byte*) RASTER#2 + (boolean~) main::$4 ← (byte~) main::$3 != (byte) 255 + if((boolean~) main::$4) goto main::@4 + to:@2 +@2: from main::@4 + (byte[256]) buffer2#8 ← phi( main::@4/(byte[256]) buffer2#9 ) + (byte[256]) buffer1#16 ← phi( main::@4/(byte[256]) buffer1#17 ) + (byte[1000]) SCREEN#4 ← phi( main::@4/(byte[1000]) SCREEN#5 ) + (byte*) RASTER#5 ← phi( main::@4/(byte*) RASTER#2 ) + (byte) main::c#2 ← phi( main::@4/(byte) main::c#3 ) + (byte) main::c#1 ← -- (byte) main::c#2 + (boolean~) main::$5 ← (byte) main::c#1 != (byte) 0 + if((boolean~) main::$5) goto main::@2 + to:@3 +@3: from @2 + (byte*) RASTER#11 ← phi( @2/(byte*) RASTER#5 ) + (byte[256]) buffer1#14 ← phi( @2/(byte[256]) buffer1#16 ) + (byte[256]) buffer2#7 ← phi( @2/(byte[256]) buffer2#8 ) + (byte[1000]) SCREEN#3 ← phi( @2/(byte[1000]) SCREEN#4 ) + call flip param-assignment + to:@17 +@17: from @3 + (byte[256]) buffer2#17 ← phi( @3/(byte[256]) buffer2#7 ) + (byte*) RASTER#10 ← phi( @3/(byte*) RASTER#11 ) + (byte[256]) buffer1#15 ← phi( @3/(byte[256]) buffer1#14 ) + (byte[1000]) SCREEN#2 ← phi( @3/(byte[1000]) SCREEN#3 ) + call plot param-assignment + to:@18 +@18: from @17 + (byte[256]) buffer2#15 ← phi( @17/(byte[256]) buffer2#17 ) + (byte[256]) buffer1#23 ← phi( @17/(byte[256]) buffer1#15 ) + (byte[1000]) SCREEN#11 ← phi( @17/(byte[1000]) SCREEN#2 ) + (byte*) RASTER#8 ← phi( @17/(byte*) RASTER#10 ) + if(true) goto main::@1 + to:main::@return +main::@return: from @18 + return + to:@RETURN +prepare: from main + (byte[256]) buffer1#5 ← phi( main/(byte[256]) buffer1#9 ) (byte) prepare::i#0 ← (byte) 0 to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -1038,19 +1108,19 @@ prepare::@1: from prepare prepare::@1 prepare::@return: from prepare::@1 return to:@RETURN -flip: from @7 - (byte[256]) buffer2#6 ← phi( @7/(byte[256]) buffer2#7 ) - (byte[256]) buffer1#10 ← phi( @7/(byte[256]) buffer1#13 ) +flip: from @3 + (byte[256]) buffer2#6 ← phi( @3/(byte[256]) buffer2#7 ) + (byte[256]) buffer1#11 ← phi( @3/(byte[256]) buffer1#14 ) (byte) flip::srcIdx#0 ← (byte) 0 (byte) flip::dstIdx#0 ← (byte) 15 (byte) flip::r#0 ← (byte) 16 to:flip::@1 -flip::@1: from @11 flip - (byte) flip::r#4 ← phi( @11/(byte) flip::r#1 flip/(byte) flip::r#0 ) - (byte[256]) buffer1#6 ← phi( @11/(byte[256]) buffer1#9 flip/(byte[256]) buffer1#10 ) - (byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#4 flip/(byte) flip::srcIdx#0 ) - (byte[256]) buffer2#3 ← phi( @11/(byte[256]) buffer2#5 flip/(byte[256]) buffer2#6 ) - (byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) flip::dstIdx#0 ) +flip::@1: from @8 flip + (byte) flip::r#4 ← phi( @8/(byte) flip::r#1 flip/(byte) flip::r#0 ) + (byte[256]) buffer1#6 ← phi( @8/(byte[256]) buffer1#10 flip/(byte[256]) buffer1#11 ) + (byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#4 flip/(byte) flip::srcIdx#0 ) + (byte[256]) buffer2#3 ← phi( @8/(byte[256]) buffer2#5 flip/(byte[256]) buffer2#6 ) + (byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) flip::dstIdx#0 ) (byte) flip::c#0 ← (byte) 16 to:flip::@2 flip::@2: from flip::@1 flip::@2 @@ -1068,27 +1138,27 @@ flip::@2: from flip::@1 flip::@2 (byte) flip::c#1 ← -- (byte) flip::c#2 (boolean~) flip::$2 ← (byte) flip::c#1 != (byte) 0 if((boolean~) flip::$2) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte[256]) buffer2#5 ← phi( flip::@2/(byte[256]) buffer2#1 ) (byte) flip::srcIdx#4 ← phi( flip::@2/(byte) flip::srcIdx#1 ) - (byte[256]) buffer1#9 ← phi( flip::@2/(byte[256]) buffer1#2 ) + (byte[256]) buffer1#10 ← phi( flip::@2/(byte[256]) buffer1#2 ) (byte) flip::r#2 ← phi( flip::@2/(byte) flip::r#3 ) (byte) flip::dstIdx#4 ← phi( flip::@2/(byte) flip::dstIdx#1 ) (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#4 (byte) flip::r#1 ← -- (byte) flip::r#2 (boolean~) flip::$3 ← (byte) flip::r#1 != (byte) 0 if((boolean~) flip::$3) goto flip::@1 - to:@12 -@12: from @11 - (byte[256]) buffer2#4 ← phi( @11/(byte[256]) buffer2#5 ) - (byte[256]) buffer1#7 ← phi( @11/(byte[256]) buffer1#9 ) + to:@9 +@9: from @8 + (byte[256]) buffer2#4 ← phi( @8/(byte[256]) buffer2#5 ) + (byte[256]) buffer1#7 ← phi( @8/(byte[256]) buffer1#10 ) (byte) flip::i#0 ← (byte) 0 to:flip::@3 -flip::@3: from @12 flip::@3 - (byte[256]) buffer1#3 ← phi( @12/(byte[256]) buffer1#7 flip::@3/(byte[256]) buffer1#3 ) - (byte) flip::i#2 ← phi( @12/(byte) flip::i#0 flip::@3/(byte) flip::i#1 ) - (byte[256]) buffer2#2 ← phi( @12/(byte[256]) buffer2#4 flip::@3/(byte[256]) buffer2#2 ) +flip::@3: from @9 flip::@3 + (byte[256]) buffer1#3 ← phi( @9/(byte[256]) buffer1#7 flip::@3/(byte[256]) buffer1#3 ) + (byte) flip::i#2 ← phi( @9/(byte) flip::i#0 flip::@3/(byte) flip::i#1 ) + (byte[256]) buffer2#2 ← phi( @9/(byte[256]) buffer2#4 flip::@3/(byte[256]) buffer2#2 ) (byte~) flip::$4 ← (byte[256]) buffer2#2 *idx (byte) flip::i#2 *((byte[256]) buffer1#3 + (byte) flip::i#2) ← (byte~) flip::$4 (byte) flip::i#1 ← ++ (byte) flip::i#2 @@ -1098,9 +1168,9 @@ flip::@3: from @12 flip::@3 flip::@return: from flip::@3 return to:@RETURN -plot: from @19 - (byte[256]) buffer1#12 ← phi( @19/(byte[256]) buffer1#14 ) - (byte[1000]) SCREEN#1 ← phi( @19/(byte[1000]) SCREEN#2 ) +plot: from @17 + (byte[256]) buffer1#13 ← phi( @17/(byte[256]) buffer1#15 ) + (byte[1000]) SCREEN#1 ← phi( @17/(byte[1000]) SCREEN#2 ) (byte~) plot::$0 ← (byte) 5 * (byte) 40 (byte*~) plot::$1 ← (byte[1000]) SCREEN#1 + (byte~) plot::$0 (byte*~) plot::$2 ← (byte*~) plot::$1 + (byte) 12 @@ -1108,11 +1178,11 @@ plot: from @19 (byte) plot::y#0 ← (byte) 16 (byte) plot::i#0 ← (byte) 0 to:plot::@1 -plot::@1: from @15 plot - (byte) plot::y#4 ← phi( @15/(byte) plot::y#1 plot/(byte) plot::y#0 ) - (byte[256]) buffer1#8 ← phi( @15/(byte[256]) buffer1#11 plot/(byte[256]) buffer1#12 ) - (byte) plot::i#3 ← phi( @15/(byte) plot::i#4 plot/(byte) plot::i#0 ) - (byte*) plot::line#4 ← phi( @15/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) +plot::@1: from @12 plot + (byte) plot::y#4 ← phi( @12/(byte) plot::y#1 plot/(byte) plot::y#0 ) + (byte[256]) buffer1#8 ← phi( @12/(byte[256]) buffer1#12 plot/(byte[256]) buffer1#13 ) + (byte) plot::i#3 ← phi( @12/(byte) plot::i#4 plot/(byte) plot::i#0 ) + (byte*) plot::line#4 ← phi( @12/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) (byte) plot::x#0 ← (byte) 0 to:plot::@2 plot::@2: from plot::@1 plot::@2 @@ -1127,10 +1197,10 @@ plot::@2: from plot::@1 plot::@2 (byte) plot::x#1 ← ++ (byte) plot::x#2 (boolean~) plot::$4 ← (byte) plot::x#1 < (byte) 16 if((boolean~) plot::$4) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte) plot::i#4 ← phi( plot::@2/(byte) plot::i#1 ) - (byte[256]) buffer1#11 ← phi( plot::@2/(byte[256]) buffer1#4 ) + (byte[256]) buffer1#12 ← phi( plot::@2/(byte[256]) buffer1#4 ) (byte) plot::y#2 ← phi( plot::@2/(byte) plot::y#3 ) (byte*) plot::line#3 ← phi( plot::@2/(byte*) plot::line#2 ) (byte*~) plot::$5 ← (byte*) plot::line#3 + (byte) 40 @@ -1139,16 +1209,16 @@ plot::@2: from plot::@1 plot::@2 (boolean~) plot::$6 ← (byte) plot::y#1 != (byte) 0 if((boolean~) plot::$6) goto plot::@1 to:plot::@return -plot::@return: from @15 +plot::@return: from @12 return to:@RETURN -@END: from @20 +@END: from @BEGIN Constant (byte[1000]) SCREEN#0 (word) 1024 Constant (byte[256]) buffer1#0 (word) 4096 Constant (byte[256]) buffer2#0 (word) 4352 Constant (byte*) RASTER#0 (word) 53266 -Constant (byte) c#0 (byte) 25 +Constant (byte) main::c#0 (byte) 25 Constant (byte) prepare::i#0 (byte) 0 Constant (byte) flip::srcIdx#0 (byte) 0 Constant (byte) flip::dstIdx#0 (byte) 15 @@ -1162,87 +1232,97 @@ Constant (byte) plot::x#0 (byte) 0 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH @BEGIN: from - call prepare param-assignment - to:@18 -@18: from @BEGIN - (byte[256]) buffer2#14 ← phi( @BEGIN/(word) 4352 ) - (byte[256]) buffer1#21 ← phi( @BEGIN/(word) 4096 ) - (byte[1000]) SCREEN#10 ← phi( @BEGIN/(word) 1024 ) - (byte*) RASTER#7 ← phi( @BEGIN/(word) 53266 ) - to:@1 -@1: from @18 @20 - (byte[256]) buffer1#20 ← phi( @18/(byte[256]) buffer1#21 @20/(byte[256]) buffer1#22 ) - (byte[256]) buffer2#13 ← phi( @18/(byte[256]) buffer2#14 @20/(byte[256]) buffer2#15 ) - (byte[1000]) SCREEN#9 ← phi( @18/(byte[1000]) SCREEN#10 @20/(byte[1000]) SCREEN#11 ) - (byte*) RASTER#5 ← phi( @18/(byte*) RASTER#7 @20/(byte*) RASTER#8 ) - to:@2 -@2: from @1 @6 - (byte[256]) buffer2#12 ← phi( @1/(byte[256]) buffer2#13 @6/(byte[256]) buffer2#8 ) - (byte[256]) buffer1#19 ← phi( @1/(byte[256]) buffer1#20 @6/(byte[256]) buffer1#15 ) - (byte[1000]) SCREEN#8 ← phi( @1/(byte[1000]) SCREEN#9 @6/(byte[1000]) SCREEN#4 ) - (byte) c#6 ← phi( @1/(byte) 25 @6/(byte) c#1 ) - (byte*) RASTER#3 ← phi( @1/(byte*) RASTER#5 @6/(byte*) RASTER#6 ) - to:@3 -@3: from @2 @3 - (byte[256]) buffer1#18 ← phi( @2/(byte[256]) buffer1#19 @3/(byte[256]) buffer1#18 ) - (byte[256]) buffer2#11 ← phi( @2/(byte[256]) buffer2#12 @3/(byte[256]) buffer2#11 ) - (byte[1000]) SCREEN#7 ← phi( @2/(byte[1000]) SCREEN#8 @3/(byte[1000]) SCREEN#7 ) - (byte) c#5 ← phi( @2/(byte) c#6 @3/(byte) c#5 ) - (byte*) RASTER#1 ← phi( @2/(byte*) RASTER#3 @3/(byte*) RASTER#1 ) - (byte~) $1 ← * (byte*) RASTER#1 - (boolean~) $2 ← (byte~) $1 != (byte) 254 - if((boolean~) $2) goto @3 - to:@5 -@5: from @3 - (byte[256]) buffer2#10 ← phi( @3/(byte[256]) buffer2#11 ) - (byte[256]) buffer1#17 ← phi( @3/(byte[256]) buffer1#18 ) - (byte[1000]) SCREEN#6 ← phi( @3/(byte[1000]) SCREEN#7 ) - (byte) c#4 ← phi( @3/(byte) c#5 ) - (byte*) RASTER#4 ← phi( @3/(byte*) RASTER#1 ) - to:@4 -@4: from @4 @5 - (byte[256]) buffer1#16 ← phi( @4/(byte[256]) buffer1#16 @5/(byte[256]) buffer1#17 ) - (byte[256]) buffer2#9 ← phi( @4/(byte[256]) buffer2#9 @5/(byte[256]) buffer2#10 ) - (byte[1000]) SCREEN#5 ← phi( @4/(byte[1000]) SCREEN#5 @5/(byte[1000]) SCREEN#6 ) - (byte) c#3 ← phi( @4/(byte) c#3 @5/(byte) c#4 ) - (byte*) RASTER#2 ← phi( @4/(byte*) RASTER#2 @5/(byte*) RASTER#4 ) - (byte~) $3 ← * (byte*) RASTER#2 - (boolean~) $4 ← (byte~) $3 != (byte) 255 - if((boolean~) $4) goto @4 - to:@6 -@6: from @4 - (byte[256]) buffer2#8 ← phi( @4/(byte[256]) buffer2#9 ) - (byte[256]) buffer1#15 ← phi( @4/(byte[256]) buffer1#16 ) - (byte[1000]) SCREEN#4 ← phi( @4/(byte[1000]) SCREEN#5 ) - (byte*) RASTER#6 ← phi( @4/(byte*) RASTER#2 ) - (byte) c#2 ← phi( @4/(byte) c#3 ) - (byte) c#1 ← -- (byte) c#2 - (boolean~) $5 ← (byte) c#1 != (byte) 0 - if((boolean~) $5) goto @2 - to:@7 -@7: from @6 - (byte*) RASTER#10 ← phi( @6/(byte*) RASTER#6 ) - (byte[256]) buffer1#13 ← phi( @6/(byte[256]) buffer1#15 ) - (byte[256]) buffer2#7 ← phi( @6/(byte[256]) buffer2#8 ) - (byte[1000]) SCREEN#3 ← phi( @6/(byte[1000]) SCREEN#4 ) - call flip param-assignment - to:@19 -@19: from @7 - (byte[256]) buffer2#16 ← phi( @7/(byte[256]) buffer2#7 ) - (byte*) RASTER#9 ← phi( @7/(byte*) RASTER#10 ) - (byte[256]) buffer1#14 ← phi( @7/(byte[256]) buffer1#13 ) - (byte[1000]) SCREEN#2 ← phi( @7/(byte[1000]) SCREEN#3 ) - call plot param-assignment - to:@20 -@20: from @19 - (byte[256]) buffer2#15 ← phi( @19/(byte[256]) buffer2#16 ) - (byte[256]) buffer1#22 ← phi( @19/(byte[256]) buffer1#14 ) - (byte[1000]) SCREEN#11 ← phi( @19/(byte[1000]) SCREEN#2 ) - (byte*) RASTER#8 ← phi( @19/(byte*) RASTER#9 ) - if(true) goto @1 + call main param-assignment to:@END -prepare: from @BEGIN - (byte[256]) buffer1#5 ← phi( @BEGIN/(word) 4096 ) +main: from @BEGIN + (byte[256]) buffer2#16 ← phi( @BEGIN/(word) 4352 ) + (byte[1000]) SCREEN#12 ← phi( @BEGIN/(word) 1024 ) + (byte*) RASTER#9 ← phi( @BEGIN/(word) 53266 ) + (byte[256]) buffer1#9 ← phi( @BEGIN/(word) 4096 ) + call prepare param-assignment + to:@16 +@16: from main + (byte[256]) buffer2#14 ← phi( main/(byte[256]) buffer2#16 ) + (byte[256]) buffer1#22 ← phi( main/(byte[256]) buffer1#9 ) + (byte[1000]) SCREEN#10 ← phi( main/(byte[1000]) SCREEN#12 ) + (byte*) RASTER#7 ← phi( main/(byte*) RASTER#9 ) + to:main::@1 +main::@1: from @16 @18 + (byte[256]) buffer1#21 ← phi( @16/(byte[256]) buffer1#22 @18/(byte[256]) buffer1#23 ) + (byte[256]) buffer2#13 ← phi( @16/(byte[256]) buffer2#14 @18/(byte[256]) buffer2#15 ) + (byte[1000]) SCREEN#9 ← phi( @16/(byte[1000]) SCREEN#10 @18/(byte[1000]) SCREEN#11 ) + (byte*) RASTER#6 ← phi( @16/(byte*) RASTER#7 @18/(byte*) RASTER#8 ) + to:main::@2 +main::@2: from @2 main::@1 + (byte[256]) buffer2#12 ← phi( @2/(byte[256]) buffer2#8 main::@1/(byte[256]) buffer2#13 ) + (byte[256]) buffer1#20 ← phi( @2/(byte[256]) buffer1#16 main::@1/(byte[256]) buffer1#21 ) + (byte[1000]) SCREEN#8 ← phi( @2/(byte[1000]) SCREEN#4 main::@1/(byte[1000]) SCREEN#9 ) + (byte) main::c#6 ← phi( @2/(byte) main::c#1 main::@1/(byte) 25 ) + (byte*) RASTER#3 ← phi( @2/(byte*) RASTER#5 main::@1/(byte*) RASTER#6 ) + to:main::@3 +main::@3: from main::@2 main::@3 + (byte[256]) buffer1#19 ← phi( main::@2/(byte[256]) buffer1#20 main::@3/(byte[256]) buffer1#19 ) + (byte[256]) buffer2#11 ← phi( main::@2/(byte[256]) buffer2#12 main::@3/(byte[256]) buffer2#11 ) + (byte[1000]) SCREEN#7 ← phi( main::@2/(byte[1000]) SCREEN#8 main::@3/(byte[1000]) SCREEN#7 ) + (byte) main::c#5 ← phi( main::@2/(byte) main::c#6 main::@3/(byte) main::c#5 ) + (byte*) RASTER#1 ← phi( main::@2/(byte*) RASTER#3 main::@3/(byte*) RASTER#1 ) + (byte~) main::$1 ← * (byte*) RASTER#1 + (boolean~) main::$2 ← (byte~) main::$1 != (byte) 254 + if((boolean~) main::$2) goto main::@3 + to:@1 +@1: from main::@3 + (byte[256]) buffer2#10 ← phi( main::@3/(byte[256]) buffer2#11 ) + (byte[256]) buffer1#18 ← phi( main::@3/(byte[256]) buffer1#19 ) + (byte[1000]) SCREEN#6 ← phi( main::@3/(byte[1000]) SCREEN#7 ) + (byte) main::c#4 ← phi( main::@3/(byte) main::c#5 ) + (byte*) RASTER#4 ← phi( main::@3/(byte*) RASTER#1 ) + to:main::@4 +main::@4: from @1 main::@4 + (byte[256]) buffer1#17 ← phi( @1/(byte[256]) buffer1#18 main::@4/(byte[256]) buffer1#17 ) + (byte[256]) buffer2#9 ← phi( @1/(byte[256]) buffer2#10 main::@4/(byte[256]) buffer2#9 ) + (byte[1000]) SCREEN#5 ← phi( @1/(byte[1000]) SCREEN#6 main::@4/(byte[1000]) SCREEN#5 ) + (byte) main::c#3 ← phi( @1/(byte) main::c#4 main::@4/(byte) main::c#3 ) + (byte*) RASTER#2 ← phi( @1/(byte*) RASTER#4 main::@4/(byte*) RASTER#2 ) + (byte~) main::$3 ← * (byte*) RASTER#2 + (boolean~) main::$4 ← (byte~) main::$3 != (byte) 255 + if((boolean~) main::$4) goto main::@4 + to:@2 +@2: from main::@4 + (byte[256]) buffer2#8 ← phi( main::@4/(byte[256]) buffer2#9 ) + (byte[256]) buffer1#16 ← phi( main::@4/(byte[256]) buffer1#17 ) + (byte[1000]) SCREEN#4 ← phi( main::@4/(byte[1000]) SCREEN#5 ) + (byte*) RASTER#5 ← phi( main::@4/(byte*) RASTER#2 ) + (byte) main::c#2 ← phi( main::@4/(byte) main::c#3 ) + (byte) main::c#1 ← -- (byte) main::c#2 + (boolean~) main::$5 ← (byte) main::c#1 != (byte) 0 + if((boolean~) main::$5) goto main::@2 + to:@3 +@3: from @2 + (byte*) RASTER#11 ← phi( @2/(byte*) RASTER#5 ) + (byte[256]) buffer1#14 ← phi( @2/(byte[256]) buffer1#16 ) + (byte[256]) buffer2#7 ← phi( @2/(byte[256]) buffer2#8 ) + (byte[1000]) SCREEN#3 ← phi( @2/(byte[1000]) SCREEN#4 ) + call flip param-assignment + to:@17 +@17: from @3 + (byte[256]) buffer2#17 ← phi( @3/(byte[256]) buffer2#7 ) + (byte*) RASTER#10 ← phi( @3/(byte*) RASTER#11 ) + (byte[256]) buffer1#15 ← phi( @3/(byte[256]) buffer1#14 ) + (byte[1000]) SCREEN#2 ← phi( @3/(byte[1000]) SCREEN#3 ) + call plot param-assignment + to:@18 +@18: from @17 + (byte[256]) buffer2#15 ← phi( @17/(byte[256]) buffer2#17 ) + (byte[256]) buffer1#23 ← phi( @17/(byte[256]) buffer1#15 ) + (byte[1000]) SCREEN#11 ← phi( @17/(byte[1000]) SCREEN#2 ) + (byte*) RASTER#8 ← phi( @17/(byte*) RASTER#10 ) + if(true) goto main::@1 + to:main::@return +main::@return: from @18 + return + to:@RETURN +prepare: from main + (byte[256]) buffer1#5 ← phi( main/(byte[256]) buffer1#9 ) to:prepare::@1 prepare::@1: from prepare prepare::@1 (byte[256]) buffer1#1 ← phi( prepare/(byte[256]) buffer1#5 prepare::@1/(byte[256]) buffer1#1 ) @@ -1255,16 +1335,16 @@ prepare::@1: from prepare prepare::@1 prepare::@return: from prepare::@1 return to:@RETURN -flip: from @7 - (byte[256]) buffer2#6 ← phi( @7/(byte[256]) buffer2#7 ) - (byte[256]) buffer1#10 ← phi( @7/(byte[256]) buffer1#13 ) +flip: from @3 + (byte[256]) buffer2#6 ← phi( @3/(byte[256]) buffer2#7 ) + (byte[256]) buffer1#11 ← phi( @3/(byte[256]) buffer1#14 ) to:flip::@1 -flip::@1: from @11 flip - (byte) flip::r#4 ← phi( @11/(byte) flip::r#1 flip/(byte) 16 ) - (byte[256]) buffer1#6 ← phi( @11/(byte[256]) buffer1#9 flip/(byte[256]) buffer1#10 ) - (byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#4 flip/(byte) 0 ) - (byte[256]) buffer2#3 ← phi( @11/(byte[256]) buffer2#5 flip/(byte[256]) buffer2#6 ) - (byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) 15 ) +flip::@1: from @8 flip + (byte) flip::r#4 ← phi( @8/(byte) flip::r#1 flip/(byte) 16 ) + (byte[256]) buffer1#6 ← phi( @8/(byte[256]) buffer1#10 flip/(byte[256]) buffer1#11 ) + (byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#4 flip/(byte) 0 ) + (byte[256]) buffer2#3 ← phi( @8/(byte[256]) buffer2#5 flip/(byte[256]) buffer2#6 ) + (byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) 15 ) to:flip::@2 flip::@2: from flip::@1 flip::@2 (byte) flip::r#3 ← phi( flip::@1/(byte) flip::r#4 flip::@2/(byte) flip::r#3 ) @@ -1281,26 +1361,26 @@ flip::@2: from flip::@1 flip::@2 (byte) flip::c#1 ← -- (byte) flip::c#2 (boolean~) flip::$2 ← (byte) flip::c#1 != (byte) 0 if((boolean~) flip::$2) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte[256]) buffer2#5 ← phi( flip::@2/(byte[256]) buffer2#1 ) (byte) flip::srcIdx#4 ← phi( flip::@2/(byte) flip::srcIdx#1 ) - (byte[256]) buffer1#9 ← phi( flip::@2/(byte[256]) buffer1#2 ) + (byte[256]) buffer1#10 ← phi( flip::@2/(byte[256]) buffer1#2 ) (byte) flip::r#2 ← phi( flip::@2/(byte) flip::r#3 ) (byte) flip::dstIdx#4 ← phi( flip::@2/(byte) flip::dstIdx#1 ) (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#4 (byte) flip::r#1 ← -- (byte) flip::r#2 (boolean~) flip::$3 ← (byte) flip::r#1 != (byte) 0 if((boolean~) flip::$3) goto flip::@1 - to:@12 -@12: from @11 - (byte[256]) buffer2#4 ← phi( @11/(byte[256]) buffer2#5 ) - (byte[256]) buffer1#7 ← phi( @11/(byte[256]) buffer1#9 ) + to:@9 +@9: from @8 + (byte[256]) buffer2#4 ← phi( @8/(byte[256]) buffer2#5 ) + (byte[256]) buffer1#7 ← phi( @8/(byte[256]) buffer1#10 ) to:flip::@3 -flip::@3: from @12 flip::@3 - (byte[256]) buffer1#3 ← phi( @12/(byte[256]) buffer1#7 flip::@3/(byte[256]) buffer1#3 ) - (byte) flip::i#2 ← phi( @12/(byte) 0 flip::@3/(byte) flip::i#1 ) - (byte[256]) buffer2#2 ← phi( @12/(byte[256]) buffer2#4 flip::@3/(byte[256]) buffer2#2 ) +flip::@3: from @9 flip::@3 + (byte[256]) buffer1#3 ← phi( @9/(byte[256]) buffer1#7 flip::@3/(byte[256]) buffer1#3 ) + (byte) flip::i#2 ← phi( @9/(byte) 0 flip::@3/(byte) flip::i#1 ) + (byte[256]) buffer2#2 ← phi( @9/(byte[256]) buffer2#4 flip::@3/(byte[256]) buffer2#2 ) (byte~) flip::$4 ← (byte[256]) buffer2#2 *idx (byte) flip::i#2 *((byte[256]) buffer1#3 + (byte) flip::i#2) ← (byte~) flip::$4 (byte) flip::i#1 ← ++ (byte) flip::i#2 @@ -1310,18 +1390,18 @@ flip::@3: from @12 flip::@3 flip::@return: from flip::@3 return to:@RETURN -plot: from @19 - (byte[256]) buffer1#12 ← phi( @19/(byte[256]) buffer1#14 ) - (byte[1000]) SCREEN#1 ← phi( @19/(byte[1000]) SCREEN#2 ) +plot: from @17 + (byte[256]) buffer1#13 ← phi( @17/(byte[256]) buffer1#15 ) + (byte[1000]) SCREEN#1 ← phi( @17/(byte[1000]) SCREEN#2 ) (byte*~) plot::$1 ← (byte[1000]) SCREEN#1 + (byte) 200 (byte*~) plot::$2 ← (byte*~) plot::$1 + (byte) 12 (byte*) plot::line#0 ← (byte*~) plot::$2 to:plot::@1 -plot::@1: from @15 plot - (byte) plot::y#4 ← phi( @15/(byte) plot::y#1 plot/(byte) 16 ) - (byte[256]) buffer1#8 ← phi( @15/(byte[256]) buffer1#11 plot/(byte[256]) buffer1#12 ) - (byte) plot::i#3 ← phi( @15/(byte) plot::i#4 plot/(byte) 0 ) - (byte*) plot::line#4 ← phi( @15/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) +plot::@1: from @12 plot + (byte) plot::y#4 ← phi( @12/(byte) plot::y#1 plot/(byte) 16 ) + (byte[256]) buffer1#8 ← phi( @12/(byte[256]) buffer1#12 plot/(byte[256]) buffer1#13 ) + (byte) plot::i#3 ← phi( @12/(byte) plot::i#4 plot/(byte) 0 ) + (byte*) plot::line#4 ← phi( @12/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) to:plot::@2 plot::@2: from plot::@1 plot::@2 (byte) plot::y#3 ← phi( plot::@1/(byte) plot::y#4 plot::@2/(byte) plot::y#3 ) @@ -1335,10 +1415,10 @@ plot::@2: from plot::@1 plot::@2 (byte) plot::x#1 ← ++ (byte) plot::x#2 (boolean~) plot::$4 ← (byte) plot::x#1 < (byte) 16 if((boolean~) plot::$4) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte) plot::i#4 ← phi( plot::@2/(byte) plot::i#1 ) - (byte[256]) buffer1#11 ← phi( plot::@2/(byte[256]) buffer1#4 ) + (byte[256]) buffer1#12 ← phi( plot::@2/(byte[256]) buffer1#4 ) (byte) plot::y#2 ← phi( plot::@2/(byte) plot::y#3 ) (byte*) plot::line#3 ← phi( plot::@2/(byte*) plot::line#2 ) (byte*~) plot::$5 ← (byte*) plot::line#3 + (byte) 40 @@ -1347,96 +1427,106 @@ plot::@2: from plot::@1 plot::@2 (boolean~) plot::$6 ← (byte) plot::y#1 != (byte) 0 if((boolean~) plot::$6) goto plot::@1 to:plot::@return -plot::@return: from @15 +plot::@return: from @12 return to:@RETURN -@END: from @20 +@END: from @BEGIN Consolidated constant in assignment (byte*~) plot::$2 Succesful SSA optimization Pass2ConstantAdditionElimination CONTROL FLOW GRAPH @BEGIN: from - call prepare param-assignment - to:@18 -@18: from @BEGIN - (byte[256]) buffer2#14 ← phi( @BEGIN/(word) 4352 ) - (byte[256]) buffer1#21 ← phi( @BEGIN/(word) 4096 ) - (byte[1000]) SCREEN#10 ← phi( @BEGIN/(word) 1024 ) - (byte*) RASTER#7 ← phi( @BEGIN/(word) 53266 ) - to:@1 -@1: from @18 @20 - (byte[256]) buffer1#20 ← phi( @18/(byte[256]) buffer1#21 @20/(byte[256]) buffer1#22 ) - (byte[256]) buffer2#13 ← phi( @18/(byte[256]) buffer2#14 @20/(byte[256]) buffer2#15 ) - (byte[1000]) SCREEN#9 ← phi( @18/(byte[1000]) SCREEN#10 @20/(byte[1000]) SCREEN#11 ) - (byte*) RASTER#5 ← phi( @18/(byte*) RASTER#7 @20/(byte*) RASTER#8 ) - to:@2 -@2: from @1 @6 - (byte[256]) buffer2#12 ← phi( @1/(byte[256]) buffer2#13 @6/(byte[256]) buffer2#8 ) - (byte[256]) buffer1#19 ← phi( @1/(byte[256]) buffer1#20 @6/(byte[256]) buffer1#15 ) - (byte[1000]) SCREEN#8 ← phi( @1/(byte[1000]) SCREEN#9 @6/(byte[1000]) SCREEN#4 ) - (byte) c#6 ← phi( @1/(byte) 25 @6/(byte) c#1 ) - (byte*) RASTER#3 ← phi( @1/(byte*) RASTER#5 @6/(byte*) RASTER#6 ) - to:@3 -@3: from @2 @3 - (byte[256]) buffer1#18 ← phi( @2/(byte[256]) buffer1#19 @3/(byte[256]) buffer1#18 ) - (byte[256]) buffer2#11 ← phi( @2/(byte[256]) buffer2#12 @3/(byte[256]) buffer2#11 ) - (byte[1000]) SCREEN#7 ← phi( @2/(byte[1000]) SCREEN#8 @3/(byte[1000]) SCREEN#7 ) - (byte) c#5 ← phi( @2/(byte) c#6 @3/(byte) c#5 ) - (byte*) RASTER#1 ← phi( @2/(byte*) RASTER#3 @3/(byte*) RASTER#1 ) - (byte~) $1 ← * (byte*) RASTER#1 - (boolean~) $2 ← (byte~) $1 != (byte) 254 - if((boolean~) $2) goto @3 - to:@5 -@5: from @3 - (byte[256]) buffer2#10 ← phi( @3/(byte[256]) buffer2#11 ) - (byte[256]) buffer1#17 ← phi( @3/(byte[256]) buffer1#18 ) - (byte[1000]) SCREEN#6 ← phi( @3/(byte[1000]) SCREEN#7 ) - (byte) c#4 ← phi( @3/(byte) c#5 ) - (byte*) RASTER#4 ← phi( @3/(byte*) RASTER#1 ) - to:@4 -@4: from @4 @5 - (byte[256]) buffer1#16 ← phi( @4/(byte[256]) buffer1#16 @5/(byte[256]) buffer1#17 ) - (byte[256]) buffer2#9 ← phi( @4/(byte[256]) buffer2#9 @5/(byte[256]) buffer2#10 ) - (byte[1000]) SCREEN#5 ← phi( @4/(byte[1000]) SCREEN#5 @5/(byte[1000]) SCREEN#6 ) - (byte) c#3 ← phi( @4/(byte) c#3 @5/(byte) c#4 ) - (byte*) RASTER#2 ← phi( @4/(byte*) RASTER#2 @5/(byte*) RASTER#4 ) - (byte~) $3 ← * (byte*) RASTER#2 - (boolean~) $4 ← (byte~) $3 != (byte) 255 - if((boolean~) $4) goto @4 - to:@6 -@6: from @4 - (byte[256]) buffer2#8 ← phi( @4/(byte[256]) buffer2#9 ) - (byte[256]) buffer1#15 ← phi( @4/(byte[256]) buffer1#16 ) - (byte[1000]) SCREEN#4 ← phi( @4/(byte[1000]) SCREEN#5 ) - (byte*) RASTER#6 ← phi( @4/(byte*) RASTER#2 ) - (byte) c#2 ← phi( @4/(byte) c#3 ) - (byte) c#1 ← -- (byte) c#2 - (boolean~) $5 ← (byte) c#1 != (byte) 0 - if((boolean~) $5) goto @2 - to:@7 -@7: from @6 - (byte*) RASTER#10 ← phi( @6/(byte*) RASTER#6 ) - (byte[256]) buffer1#13 ← phi( @6/(byte[256]) buffer1#15 ) - (byte[256]) buffer2#7 ← phi( @6/(byte[256]) buffer2#8 ) - (byte[1000]) SCREEN#3 ← phi( @6/(byte[1000]) SCREEN#4 ) - call flip param-assignment - to:@19 -@19: from @7 - (byte[256]) buffer2#16 ← phi( @7/(byte[256]) buffer2#7 ) - (byte*) RASTER#9 ← phi( @7/(byte*) RASTER#10 ) - (byte[256]) buffer1#14 ← phi( @7/(byte[256]) buffer1#13 ) - (byte[1000]) SCREEN#2 ← phi( @7/(byte[1000]) SCREEN#3 ) - call plot param-assignment - to:@20 -@20: from @19 - (byte[256]) buffer2#15 ← phi( @19/(byte[256]) buffer2#16 ) - (byte[256]) buffer1#22 ← phi( @19/(byte[256]) buffer1#14 ) - (byte[1000]) SCREEN#11 ← phi( @19/(byte[1000]) SCREEN#2 ) - (byte*) RASTER#8 ← phi( @19/(byte*) RASTER#9 ) - if(true) goto @1 + call main param-assignment to:@END -prepare: from @BEGIN - (byte[256]) buffer1#5 ← phi( @BEGIN/(word) 4096 ) +main: from @BEGIN + (byte[256]) buffer2#16 ← phi( @BEGIN/(word) 4352 ) + (byte[1000]) SCREEN#12 ← phi( @BEGIN/(word) 1024 ) + (byte*) RASTER#9 ← phi( @BEGIN/(word) 53266 ) + (byte[256]) buffer1#9 ← phi( @BEGIN/(word) 4096 ) + call prepare param-assignment + to:@16 +@16: from main + (byte[256]) buffer2#14 ← phi( main/(byte[256]) buffer2#16 ) + (byte[256]) buffer1#22 ← phi( main/(byte[256]) buffer1#9 ) + (byte[1000]) SCREEN#10 ← phi( main/(byte[1000]) SCREEN#12 ) + (byte*) RASTER#7 ← phi( main/(byte*) RASTER#9 ) + to:main::@1 +main::@1: from @16 @18 + (byte[256]) buffer1#21 ← phi( @16/(byte[256]) buffer1#22 @18/(byte[256]) buffer1#23 ) + (byte[256]) buffer2#13 ← phi( @16/(byte[256]) buffer2#14 @18/(byte[256]) buffer2#15 ) + (byte[1000]) SCREEN#9 ← phi( @16/(byte[1000]) SCREEN#10 @18/(byte[1000]) SCREEN#11 ) + (byte*) RASTER#6 ← phi( @16/(byte*) RASTER#7 @18/(byte*) RASTER#8 ) + to:main::@2 +main::@2: from @2 main::@1 + (byte[256]) buffer2#12 ← phi( @2/(byte[256]) buffer2#8 main::@1/(byte[256]) buffer2#13 ) + (byte[256]) buffer1#20 ← phi( @2/(byte[256]) buffer1#16 main::@1/(byte[256]) buffer1#21 ) + (byte[1000]) SCREEN#8 ← phi( @2/(byte[1000]) SCREEN#4 main::@1/(byte[1000]) SCREEN#9 ) + (byte) main::c#6 ← phi( @2/(byte) main::c#1 main::@1/(byte) 25 ) + (byte*) RASTER#3 ← phi( @2/(byte*) RASTER#5 main::@1/(byte*) RASTER#6 ) + to:main::@3 +main::@3: from main::@2 main::@3 + (byte[256]) buffer1#19 ← phi( main::@2/(byte[256]) buffer1#20 main::@3/(byte[256]) buffer1#19 ) + (byte[256]) buffer2#11 ← phi( main::@2/(byte[256]) buffer2#12 main::@3/(byte[256]) buffer2#11 ) + (byte[1000]) SCREEN#7 ← phi( main::@2/(byte[1000]) SCREEN#8 main::@3/(byte[1000]) SCREEN#7 ) + (byte) main::c#5 ← phi( main::@2/(byte) main::c#6 main::@3/(byte) main::c#5 ) + (byte*) RASTER#1 ← phi( main::@2/(byte*) RASTER#3 main::@3/(byte*) RASTER#1 ) + (byte~) main::$1 ← * (byte*) RASTER#1 + (boolean~) main::$2 ← (byte~) main::$1 != (byte) 254 + if((boolean~) main::$2) goto main::@3 + to:@1 +@1: from main::@3 + (byte[256]) buffer2#10 ← phi( main::@3/(byte[256]) buffer2#11 ) + (byte[256]) buffer1#18 ← phi( main::@3/(byte[256]) buffer1#19 ) + (byte[1000]) SCREEN#6 ← phi( main::@3/(byte[1000]) SCREEN#7 ) + (byte) main::c#4 ← phi( main::@3/(byte) main::c#5 ) + (byte*) RASTER#4 ← phi( main::@3/(byte*) RASTER#1 ) + to:main::@4 +main::@4: from @1 main::@4 + (byte[256]) buffer1#17 ← phi( @1/(byte[256]) buffer1#18 main::@4/(byte[256]) buffer1#17 ) + (byte[256]) buffer2#9 ← phi( @1/(byte[256]) buffer2#10 main::@4/(byte[256]) buffer2#9 ) + (byte[1000]) SCREEN#5 ← phi( @1/(byte[1000]) SCREEN#6 main::@4/(byte[1000]) SCREEN#5 ) + (byte) main::c#3 ← phi( @1/(byte) main::c#4 main::@4/(byte) main::c#3 ) + (byte*) RASTER#2 ← phi( @1/(byte*) RASTER#4 main::@4/(byte*) RASTER#2 ) + (byte~) main::$3 ← * (byte*) RASTER#2 + (boolean~) main::$4 ← (byte~) main::$3 != (byte) 255 + if((boolean~) main::$4) goto main::@4 + to:@2 +@2: from main::@4 + (byte[256]) buffer2#8 ← phi( main::@4/(byte[256]) buffer2#9 ) + (byte[256]) buffer1#16 ← phi( main::@4/(byte[256]) buffer1#17 ) + (byte[1000]) SCREEN#4 ← phi( main::@4/(byte[1000]) SCREEN#5 ) + (byte*) RASTER#5 ← phi( main::@4/(byte*) RASTER#2 ) + (byte) main::c#2 ← phi( main::@4/(byte) main::c#3 ) + (byte) main::c#1 ← -- (byte) main::c#2 + (boolean~) main::$5 ← (byte) main::c#1 != (byte) 0 + if((boolean~) main::$5) goto main::@2 + to:@3 +@3: from @2 + (byte*) RASTER#11 ← phi( @2/(byte*) RASTER#5 ) + (byte[256]) buffer1#14 ← phi( @2/(byte[256]) buffer1#16 ) + (byte[256]) buffer2#7 ← phi( @2/(byte[256]) buffer2#8 ) + (byte[1000]) SCREEN#3 ← phi( @2/(byte[1000]) SCREEN#4 ) + call flip param-assignment + to:@17 +@17: from @3 + (byte[256]) buffer2#17 ← phi( @3/(byte[256]) buffer2#7 ) + (byte*) RASTER#10 ← phi( @3/(byte*) RASTER#11 ) + (byte[256]) buffer1#15 ← phi( @3/(byte[256]) buffer1#14 ) + (byte[1000]) SCREEN#2 ← phi( @3/(byte[1000]) SCREEN#3 ) + call plot param-assignment + to:@18 +@18: from @17 + (byte[256]) buffer2#15 ← phi( @17/(byte[256]) buffer2#17 ) + (byte[256]) buffer1#23 ← phi( @17/(byte[256]) buffer1#15 ) + (byte[1000]) SCREEN#11 ← phi( @17/(byte[1000]) SCREEN#2 ) + (byte*) RASTER#8 ← phi( @17/(byte*) RASTER#10 ) + if(true) goto main::@1 + to:main::@return +main::@return: from @18 + return + to:@RETURN +prepare: from main + (byte[256]) buffer1#5 ← phi( main/(byte[256]) buffer1#9 ) to:prepare::@1 prepare::@1: from prepare prepare::@1 (byte[256]) buffer1#1 ← phi( prepare/(byte[256]) buffer1#5 prepare::@1/(byte[256]) buffer1#1 ) @@ -1449,16 +1539,16 @@ prepare::@1: from prepare prepare::@1 prepare::@return: from prepare::@1 return to:@RETURN -flip: from @7 - (byte[256]) buffer2#6 ← phi( @7/(byte[256]) buffer2#7 ) - (byte[256]) buffer1#10 ← phi( @7/(byte[256]) buffer1#13 ) +flip: from @3 + (byte[256]) buffer2#6 ← phi( @3/(byte[256]) buffer2#7 ) + (byte[256]) buffer1#11 ← phi( @3/(byte[256]) buffer1#14 ) to:flip::@1 -flip::@1: from @11 flip - (byte) flip::r#4 ← phi( @11/(byte) flip::r#1 flip/(byte) 16 ) - (byte[256]) buffer1#6 ← phi( @11/(byte[256]) buffer1#9 flip/(byte[256]) buffer1#10 ) - (byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#4 flip/(byte) 0 ) - (byte[256]) buffer2#3 ← phi( @11/(byte[256]) buffer2#5 flip/(byte[256]) buffer2#6 ) - (byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) 15 ) +flip::@1: from @8 flip + (byte) flip::r#4 ← phi( @8/(byte) flip::r#1 flip/(byte) 16 ) + (byte[256]) buffer1#6 ← phi( @8/(byte[256]) buffer1#10 flip/(byte[256]) buffer1#11 ) + (byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#4 flip/(byte) 0 ) + (byte[256]) buffer2#3 ← phi( @8/(byte[256]) buffer2#5 flip/(byte[256]) buffer2#6 ) + (byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) 15 ) to:flip::@2 flip::@2: from flip::@1 flip::@2 (byte) flip::r#3 ← phi( flip::@1/(byte) flip::r#4 flip::@2/(byte) flip::r#3 ) @@ -1475,26 +1565,26 @@ flip::@2: from flip::@1 flip::@2 (byte) flip::c#1 ← -- (byte) flip::c#2 (boolean~) flip::$2 ← (byte) flip::c#1 != (byte) 0 if((boolean~) flip::$2) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte[256]) buffer2#5 ← phi( flip::@2/(byte[256]) buffer2#1 ) (byte) flip::srcIdx#4 ← phi( flip::@2/(byte) flip::srcIdx#1 ) - (byte[256]) buffer1#9 ← phi( flip::@2/(byte[256]) buffer1#2 ) + (byte[256]) buffer1#10 ← phi( flip::@2/(byte[256]) buffer1#2 ) (byte) flip::r#2 ← phi( flip::@2/(byte) flip::r#3 ) (byte) flip::dstIdx#4 ← phi( flip::@2/(byte) flip::dstIdx#1 ) (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#4 (byte) flip::r#1 ← -- (byte) flip::r#2 (boolean~) flip::$3 ← (byte) flip::r#1 != (byte) 0 if((boolean~) flip::$3) goto flip::@1 - to:@12 -@12: from @11 - (byte[256]) buffer2#4 ← phi( @11/(byte[256]) buffer2#5 ) - (byte[256]) buffer1#7 ← phi( @11/(byte[256]) buffer1#9 ) + to:@9 +@9: from @8 + (byte[256]) buffer2#4 ← phi( @8/(byte[256]) buffer2#5 ) + (byte[256]) buffer1#7 ← phi( @8/(byte[256]) buffer1#10 ) to:flip::@3 -flip::@3: from @12 flip::@3 - (byte[256]) buffer1#3 ← phi( @12/(byte[256]) buffer1#7 flip::@3/(byte[256]) buffer1#3 ) - (byte) flip::i#2 ← phi( @12/(byte) 0 flip::@3/(byte) flip::i#1 ) - (byte[256]) buffer2#2 ← phi( @12/(byte[256]) buffer2#4 flip::@3/(byte[256]) buffer2#2 ) +flip::@3: from @9 flip::@3 + (byte[256]) buffer1#3 ← phi( @9/(byte[256]) buffer1#7 flip::@3/(byte[256]) buffer1#3 ) + (byte) flip::i#2 ← phi( @9/(byte) 0 flip::@3/(byte) flip::i#1 ) + (byte[256]) buffer2#2 ← phi( @9/(byte[256]) buffer2#4 flip::@3/(byte[256]) buffer2#2 ) (byte~) flip::$4 ← (byte[256]) buffer2#2 *idx (byte) flip::i#2 *((byte[256]) buffer1#3 + (byte) flip::i#2) ← (byte~) flip::$4 (byte) flip::i#1 ← ++ (byte) flip::i#2 @@ -1504,18 +1594,18 @@ flip::@3: from @12 flip::@3 flip::@return: from flip::@3 return to:@RETURN -plot: from @19 - (byte[256]) buffer1#12 ← phi( @19/(byte[256]) buffer1#14 ) - (byte[1000]) SCREEN#1 ← phi( @19/(byte[1000]) SCREEN#2 ) +plot: from @17 + (byte[256]) buffer1#13 ← phi( @17/(byte[256]) buffer1#15 ) + (byte[1000]) SCREEN#1 ← phi( @17/(byte[1000]) SCREEN#2 ) (byte*~) plot::$1 ← (byte[1000]) SCREEN#1 (byte*~) plot::$2 ← (byte*~) plot::$1 + (byte) 212 (byte*) plot::line#0 ← (byte*~) plot::$2 to:plot::@1 -plot::@1: from @15 plot - (byte) plot::y#4 ← phi( @15/(byte) plot::y#1 plot/(byte) 16 ) - (byte[256]) buffer1#8 ← phi( @15/(byte[256]) buffer1#11 plot/(byte[256]) buffer1#12 ) - (byte) plot::i#3 ← phi( @15/(byte) plot::i#4 plot/(byte) 0 ) - (byte*) plot::line#4 ← phi( @15/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) +plot::@1: from @12 plot + (byte) plot::y#4 ← phi( @12/(byte) plot::y#1 plot/(byte) 16 ) + (byte[256]) buffer1#8 ← phi( @12/(byte[256]) buffer1#12 plot/(byte[256]) buffer1#13 ) + (byte) plot::i#3 ← phi( @12/(byte) plot::i#4 plot/(byte) 0 ) + (byte*) plot::line#4 ← phi( @12/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) to:plot::@2 plot::@2: from plot::@1 plot::@2 (byte) plot::y#3 ← phi( plot::@1/(byte) plot::y#4 plot::@2/(byte) plot::y#3 ) @@ -1529,10 +1619,10 @@ plot::@2: from plot::@1 plot::@2 (byte) plot::x#1 ← ++ (byte) plot::x#2 (boolean~) plot::$4 ← (byte) plot::x#1 < (byte) 16 if((boolean~) plot::$4) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte) plot::i#4 ← phi( plot::@2/(byte) plot::i#1 ) - (byte[256]) buffer1#11 ← phi( plot::@2/(byte[256]) buffer1#4 ) + (byte[256]) buffer1#12 ← phi( plot::@2/(byte[256]) buffer1#4 ) (byte) plot::y#2 ← phi( plot::@2/(byte) plot::y#3 ) (byte*) plot::line#3 ← phi( plot::@2/(byte*) plot::line#2 ) (byte*~) plot::$5 ← (byte*) plot::line#3 + (byte) 40 @@ -1541,97 +1631,106 @@ plot::@2: from plot::@1 plot::@2 (boolean~) plot::$6 ← (byte) plot::y#1 != (byte) 0 if((boolean~) plot::$6) goto plot::@1 to:plot::@return -plot::@return: from @15 +plot::@return: from @12 return to:@RETURN -@END: from @20 +@END: from @BEGIN +Alias (byte[256]) buffer2#14 = (byte[256]) buffer2#16 +Alias (byte[256]) buffer1#22 = (byte[256]) buffer1#9 (byte[256]) buffer1#5 +Alias (byte[1000]) SCREEN#10 = (byte[1000]) SCREEN#12 +Alias (byte*) RASTER#7 = (byte*) RASTER#9 Alias (byte[256]) buffer2#10 = (byte[256]) buffer2#11 -Alias (byte[256]) buffer1#17 = (byte[256]) buffer1#18 +Alias (byte[256]) buffer1#18 = (byte[256]) buffer1#19 Alias (byte[1000]) SCREEN#6 = (byte[1000]) SCREEN#7 -Alias (byte) c#4 = (byte) c#5 +Alias (byte) main::c#4 = (byte) main::c#5 Alias (byte*) RASTER#1 = (byte*) RASTER#4 -Alias (byte[256]) buffer2#15 = (byte[256]) buffer2#8 (byte[256]) buffer2#9 (byte[256]) buffer2#7 (byte[256]) buffer2#16 (byte[256]) buffer2#6 -Alias (byte[256]) buffer1#10 = (byte[256]) buffer1#15 (byte[256]) buffer1#16 (byte[256]) buffer1#13 (byte[256]) buffer1#14 (byte[256]) buffer1#22 (byte[256]) buffer1#12 +Alias (byte[256]) buffer2#15 = (byte[256]) buffer2#8 (byte[256]) buffer2#9 (byte[256]) buffer2#7 (byte[256]) buffer2#17 (byte[256]) buffer2#6 +Alias (byte[256]) buffer1#11 = (byte[256]) buffer1#16 (byte[256]) buffer1#17 (byte[256]) buffer1#14 (byte[256]) buffer1#15 (byte[256]) buffer1#23 (byte[256]) buffer1#13 Alias (byte[1000]) SCREEN#1 = (byte[1000]) SCREEN#4 (byte[1000]) SCREEN#5 (byte[1000]) SCREEN#3 (byte[1000]) SCREEN#2 (byte[1000]) SCREEN#11 (byte*~) plot::$1 -Alias (byte*) RASTER#10 = (byte*) RASTER#6 (byte*) RASTER#2 (byte*) RASTER#9 (byte*) RASTER#8 -Alias (byte) c#2 = (byte) c#3 +Alias (byte*) RASTER#10 = (byte*) RASTER#5 (byte*) RASTER#2 (byte*) RASTER#11 (byte*) RASTER#8 +Alias (byte) main::c#2 = (byte) main::c#3 Alias (byte) flip::dstIdx#1 = (byte~) flip::$1 (byte) flip::dstIdx#4 Alias (byte[256]) buffer2#1 = (byte[256]) buffer2#5 (byte[256]) buffer2#4 Alias (byte) flip::srcIdx#1 = (byte) flip::srcIdx#4 -Alias (byte[256]) buffer1#2 = (byte[256]) buffer1#9 (byte[256]) buffer1#7 +Alias (byte[256]) buffer1#10 = (byte[256]) buffer1#2 (byte[256]) buffer1#7 Alias (byte) flip::r#2 = (byte) flip::r#3 Alias (byte*) plot::line#0 = (byte*~) plot::$2 Alias (byte) plot::i#1 = (byte) plot::i#4 -Alias (byte[256]) buffer1#11 = (byte[256]) buffer1#4 +Alias (byte[256]) buffer1#12 = (byte[256]) buffer1#4 Alias (byte) plot::y#2 = (byte) plot::y#3 Alias (byte*) plot::line#2 = (byte*) plot::line#3 Alias (byte*) plot::line#1 = (byte*~) plot::$5 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH @BEGIN: from - call prepare param-assignment - to:@18 -@18: from @BEGIN + call main param-assignment + to:@END +main: from @BEGIN (byte[256]) buffer2#14 ← phi( @BEGIN/(word) 4352 ) - (byte[256]) buffer1#21 ← phi( @BEGIN/(word) 4096 ) (byte[1000]) SCREEN#10 ← phi( @BEGIN/(word) 1024 ) (byte*) RASTER#7 ← phi( @BEGIN/(word) 53266 ) + (byte[256]) buffer1#22 ← phi( @BEGIN/(word) 4096 ) + call prepare param-assignment + to:@16 +@16: from main + to:main::@1 +main::@1: from @16 @18 + (byte[256]) buffer1#21 ← phi( @16/(byte[256]) buffer1#22 @18/(byte[256]) buffer1#11 ) + (byte[256]) buffer2#13 ← phi( @16/(byte[256]) buffer2#14 @18/(byte[256]) buffer2#15 ) + (byte[1000]) SCREEN#9 ← phi( @16/(byte[1000]) SCREEN#10 @18/(byte[1000]) SCREEN#1 ) + (byte*) RASTER#6 ← phi( @16/(byte*) RASTER#7 @18/(byte*) RASTER#10 ) + to:main::@2 +main::@2: from @2 main::@1 + (byte[256]) buffer2#12 ← phi( @2/(byte[256]) buffer2#15 main::@1/(byte[256]) buffer2#13 ) + (byte[256]) buffer1#20 ← phi( @2/(byte[256]) buffer1#11 main::@1/(byte[256]) buffer1#21 ) + (byte[1000]) SCREEN#8 ← phi( @2/(byte[1000]) SCREEN#1 main::@1/(byte[1000]) SCREEN#9 ) + (byte) main::c#6 ← phi( @2/(byte) main::c#1 main::@1/(byte) 25 ) + (byte*) RASTER#3 ← phi( @2/(byte*) RASTER#10 main::@1/(byte*) RASTER#6 ) + to:main::@3 +main::@3: from main::@2 main::@3 + (byte[256]) buffer1#18 ← phi( main::@2/(byte[256]) buffer1#20 main::@3/(byte[256]) buffer1#18 ) + (byte[256]) buffer2#10 ← phi( main::@2/(byte[256]) buffer2#12 main::@3/(byte[256]) buffer2#10 ) + (byte[1000]) SCREEN#6 ← phi( main::@2/(byte[1000]) SCREEN#8 main::@3/(byte[1000]) SCREEN#6 ) + (byte) main::c#4 ← phi( main::@2/(byte) main::c#6 main::@3/(byte) main::c#4 ) + (byte*) RASTER#1 ← phi( main::@2/(byte*) RASTER#3 main::@3/(byte*) RASTER#1 ) + (byte~) main::$1 ← * (byte*) RASTER#1 + (boolean~) main::$2 ← (byte~) main::$1 != (byte) 254 + if((boolean~) main::$2) goto main::@3 to:@1 -@1: from @18 @20 - (byte[256]) buffer1#20 ← phi( @18/(byte[256]) buffer1#21 @20/(byte[256]) buffer1#10 ) - (byte[256]) buffer2#13 ← phi( @18/(byte[256]) buffer2#14 @20/(byte[256]) buffer2#15 ) - (byte[1000]) SCREEN#9 ← phi( @18/(byte[1000]) SCREEN#10 @20/(byte[1000]) SCREEN#1 ) - (byte*) RASTER#5 ← phi( @18/(byte*) RASTER#7 @20/(byte*) RASTER#10 ) +@1: from main::@3 + to:main::@4 +main::@4: from @1 main::@4 + (byte[256]) buffer1#11 ← phi( @1/(byte[256]) buffer1#18 main::@4/(byte[256]) buffer1#11 ) + (byte[256]) buffer2#15 ← phi( @1/(byte[256]) buffer2#10 main::@4/(byte[256]) buffer2#15 ) + (byte[1000]) SCREEN#1 ← phi( @1/(byte[1000]) SCREEN#6 main::@4/(byte[1000]) SCREEN#1 ) + (byte) main::c#2 ← phi( @1/(byte) main::c#4 main::@4/(byte) main::c#2 ) + (byte*) RASTER#10 ← phi( @1/(byte*) RASTER#1 main::@4/(byte*) RASTER#10 ) + (byte~) main::$3 ← * (byte*) RASTER#10 + (boolean~) main::$4 ← (byte~) main::$3 != (byte) 255 + if((boolean~) main::$4) goto main::@4 to:@2 -@2: from @1 @6 - (byte[256]) buffer2#12 ← phi( @1/(byte[256]) buffer2#13 @6/(byte[256]) buffer2#15 ) - (byte[256]) buffer1#19 ← phi( @1/(byte[256]) buffer1#20 @6/(byte[256]) buffer1#10 ) - (byte[1000]) SCREEN#8 ← phi( @1/(byte[1000]) SCREEN#9 @6/(byte[1000]) SCREEN#1 ) - (byte) c#6 ← phi( @1/(byte) 25 @6/(byte) c#1 ) - (byte*) RASTER#3 ← phi( @1/(byte*) RASTER#5 @6/(byte*) RASTER#10 ) +@2: from main::@4 + (byte) main::c#1 ← -- (byte) main::c#2 + (boolean~) main::$5 ← (byte) main::c#1 != (byte) 0 + if((boolean~) main::$5) goto main::@2 to:@3 -@3: from @2 @3 - (byte[256]) buffer1#17 ← phi( @2/(byte[256]) buffer1#19 @3/(byte[256]) buffer1#17 ) - (byte[256]) buffer2#10 ← phi( @2/(byte[256]) buffer2#12 @3/(byte[256]) buffer2#10 ) - (byte[1000]) SCREEN#6 ← phi( @2/(byte[1000]) SCREEN#8 @3/(byte[1000]) SCREEN#6 ) - (byte) c#4 ← phi( @2/(byte) c#6 @3/(byte) c#4 ) - (byte*) RASTER#1 ← phi( @2/(byte*) RASTER#3 @3/(byte*) RASTER#1 ) - (byte~) $1 ← * (byte*) RASTER#1 - (boolean~) $2 ← (byte~) $1 != (byte) 254 - if((boolean~) $2) goto @3 - to:@5 -@5: from @3 - to:@4 -@4: from @4 @5 - (byte[256]) buffer1#10 ← phi( @4/(byte[256]) buffer1#10 @5/(byte[256]) buffer1#17 ) - (byte[256]) buffer2#15 ← phi( @4/(byte[256]) buffer2#15 @5/(byte[256]) buffer2#10 ) - (byte[1000]) SCREEN#1 ← phi( @4/(byte[1000]) SCREEN#1 @5/(byte[1000]) SCREEN#6 ) - (byte) c#2 ← phi( @4/(byte) c#2 @5/(byte) c#4 ) - (byte*) RASTER#10 ← phi( @4/(byte*) RASTER#10 @5/(byte*) RASTER#1 ) - (byte~) $3 ← * (byte*) RASTER#10 - (boolean~) $4 ← (byte~) $3 != (byte) 255 - if((boolean~) $4) goto @4 - to:@6 -@6: from @4 - (byte) c#1 ← -- (byte) c#2 - (boolean~) $5 ← (byte) c#1 != (byte) 0 - if((boolean~) $5) goto @2 - to:@7 -@7: from @6 +@3: from @2 call flip param-assignment - to:@19 -@19: from @7 + to:@17 +@17: from @3 call plot param-assignment - to:@20 -@20: from @19 - if(true) goto @1 - to:@END -prepare: from @BEGIN - (byte[256]) buffer1#5 ← phi( @BEGIN/(word) 4096 ) + to:@18 +@18: from @17 + if(true) goto main::@1 + to:main::@return +main::@return: from @18 + return + to:@RETURN +prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 - (byte[256]) buffer1#1 ← phi( prepare/(byte[256]) buffer1#5 prepare::@1/(byte[256]) buffer1#1 ) + (byte[256]) buffer1#1 ← phi( prepare/(byte[256]) buffer1#22 prepare::@1/(byte[256]) buffer1#1 ) (byte) prepare::i#2 ← phi( prepare/(byte) 0 prepare::@1/(byte) prepare::i#1 ) *((byte[256]) buffer1#1 + (byte) prepare::i#2) ← (byte) prepare::i#2 (byte) prepare::i#1 ← ++ (byte) prepare::i#2 @@ -1641,14 +1740,14 @@ prepare::@1: from prepare prepare::@1 prepare::@return: from prepare::@1 return to:@RETURN -flip: from @7 +flip: from @3 to:flip::@1 -flip::@1: from @11 flip - (byte) flip::r#4 ← phi( @11/(byte) flip::r#1 flip/(byte) 16 ) - (byte[256]) buffer1#6 ← phi( @11/(byte[256]) buffer1#2 flip/(byte[256]) buffer1#10 ) - (byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#1 flip/(byte) 0 ) - (byte[256]) buffer2#3 ← phi( @11/(byte[256]) buffer2#1 flip/(byte[256]) buffer2#15 ) - (byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) 15 ) +flip::@1: from @8 flip + (byte) flip::r#4 ← phi( @8/(byte) flip::r#1 flip/(byte) 16 ) + (byte[256]) buffer1#6 ← phi( @8/(byte[256]) buffer1#10 flip/(byte[256]) buffer1#11 ) + (byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#1 flip/(byte) 0 ) + (byte[256]) buffer2#3 ← phi( @8/(byte[256]) buffer2#1 flip/(byte[256]) buffer2#15 ) + (byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) 15 ) to:flip::@2 flip::@2: from flip::@1 flip::@2 (byte) flip::r#2 ← phi( flip::@1/(byte) flip::r#4 flip::@2/(byte) flip::r#2 ) @@ -1656,27 +1755,27 @@ flip::@2: from flip::@1 flip::@2 (byte) flip::dstIdx#3 ← phi( flip::@1/(byte) flip::dstIdx#5 flip::@2/(byte) flip::dstIdx#1 ) (byte[256]) buffer2#1 ← phi( flip::@1/(byte[256]) buffer2#3 flip::@2/(byte[256]) buffer2#1 ) (byte) flip::srcIdx#2 ← phi( flip::@1/(byte) flip::srcIdx#3 flip::@2/(byte) flip::srcIdx#1 ) - (byte[256]) buffer1#2 ← phi( flip::@1/(byte[256]) buffer1#6 flip::@2/(byte[256]) buffer1#2 ) - (byte~) flip::$0 ← (byte[256]) buffer1#2 *idx (byte) flip::srcIdx#2 + (byte[256]) buffer1#10 ← phi( flip::@1/(byte[256]) buffer1#6 flip::@2/(byte[256]) buffer1#10 ) + (byte~) flip::$0 ← (byte[256]) buffer1#10 *idx (byte) flip::srcIdx#2 *((byte[256]) buffer2#1 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 (byte) flip::c#1 ← -- (byte) flip::c#2 (boolean~) flip::$2 ← (byte) flip::c#1 != (byte) 0 if((boolean~) flip::$2) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 (byte) flip::r#1 ← -- (byte) flip::r#2 (boolean~) flip::$3 ← (byte) flip::r#1 != (byte) 0 if((boolean~) flip::$3) goto flip::@1 - to:@12 -@12: from @11 + to:@9 +@9: from @8 to:flip::@3 -flip::@3: from @12 flip::@3 - (byte[256]) buffer1#3 ← phi( @12/(byte[256]) buffer1#2 flip::@3/(byte[256]) buffer1#3 ) - (byte) flip::i#2 ← phi( @12/(byte) 0 flip::@3/(byte) flip::i#1 ) - (byte[256]) buffer2#2 ← phi( @12/(byte[256]) buffer2#1 flip::@3/(byte[256]) buffer2#2 ) +flip::@3: from @9 flip::@3 + (byte[256]) buffer1#3 ← phi( @9/(byte[256]) buffer1#10 flip::@3/(byte[256]) buffer1#3 ) + (byte) flip::i#2 ← phi( @9/(byte) 0 flip::@3/(byte) flip::i#1 ) + (byte[256]) buffer2#2 ← phi( @9/(byte[256]) buffer2#1 flip::@3/(byte[256]) buffer2#2 ) (byte~) flip::$4 ← (byte[256]) buffer2#2 *idx (byte) flip::i#2 *((byte[256]) buffer1#3 + (byte) flip::i#2) ← (byte~) flip::$4 (byte) flip::i#1 ← ++ (byte) flip::i#2 @@ -1686,101 +1785,106 @@ flip::@3: from @12 flip::@3 flip::@return: from flip::@3 return to:@RETURN -plot: from @19 +plot: from @17 (byte*) plot::line#0 ← (byte[1000]) SCREEN#1 + (byte) 212 to:plot::@1 -plot::@1: from @15 plot - (byte) plot::y#4 ← phi( @15/(byte) plot::y#1 plot/(byte) 16 ) - (byte[256]) buffer1#8 ← phi( @15/(byte[256]) buffer1#11 plot/(byte[256]) buffer1#10 ) - (byte) plot::i#3 ← phi( @15/(byte) plot::i#1 plot/(byte) 0 ) - (byte*) plot::line#4 ← phi( @15/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) +plot::@1: from @12 plot + (byte) plot::y#4 ← phi( @12/(byte) plot::y#1 plot/(byte) 16 ) + (byte[256]) buffer1#8 ← phi( @12/(byte[256]) buffer1#12 plot/(byte[256]) buffer1#11 ) + (byte) plot::i#3 ← phi( @12/(byte) plot::i#1 plot/(byte) 0 ) + (byte*) plot::line#4 ← phi( @12/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) to:plot::@2 plot::@2: from plot::@1 plot::@2 (byte) plot::y#2 ← phi( plot::@1/(byte) plot::y#4 plot::@2/(byte) plot::y#2 ) (byte) plot::x#2 ← phi( plot::@1/(byte) 0 plot::@2/(byte) plot::x#1 ) (byte*) plot::line#2 ← phi( plot::@1/(byte*) plot::line#4 plot::@2/(byte*) plot::line#2 ) (byte) plot::i#2 ← phi( plot::@1/(byte) plot::i#3 plot::@2/(byte) plot::i#1 ) - (byte[256]) buffer1#11 ← phi( plot::@1/(byte[256]) buffer1#8 plot::@2/(byte[256]) buffer1#11 ) - (byte~) plot::$3 ← (byte[256]) buffer1#11 *idx (byte) plot::i#2 + (byte[256]) buffer1#12 ← phi( plot::@1/(byte[256]) buffer1#8 plot::@2/(byte[256]) buffer1#12 ) + (byte~) plot::$3 ← (byte[256]) buffer1#12 *idx (byte) plot::i#2 *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 (byte) plot::i#1 ← ++ (byte) plot::i#2 (byte) plot::x#1 ← ++ (byte) plot::x#2 (boolean~) plot::$4 ← (byte) plot::x#1 < (byte) 16 if((boolean~) plot::$4) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 (byte) plot::y#1 ← -- (byte) plot::y#2 (boolean~) plot::$6 ← (byte) plot::y#1 != (byte) 0 if((boolean~) plot::$6) goto plot::@1 to:plot::@return -plot::@return: from @15 +plot::@return: from @12 return to:@RETURN -@END: from @20 +@END: from @BEGIN Redundant Phi (byte[256]) buffer2#14 (word) 4352 -Redundant Phi (byte[256]) buffer1#21 (word) 4096 Redundant Phi (byte[1000]) SCREEN#10 (word) 1024 Redundant Phi (byte*) RASTER#7 (word) 53266 -Redundant Phi (byte[256]) buffer1#5 (word) 4096 +Redundant Phi (byte[256]) buffer1#22 (word) 4096 Succesful SSA optimization Pass2RedundantPhiElimination CONTROL FLOW GRAPH @BEGIN: from - call prepare param-assignment - to:@18 -@18: from @BEGIN - to:@1 -@1: from @18 @20 - (byte[256]) buffer1#20 ← phi( @18/(word) 4096 @20/(byte[256]) buffer1#10 ) - (byte[256]) buffer2#13 ← phi( @18/(word) 4352 @20/(byte[256]) buffer2#15 ) - (byte[1000]) SCREEN#9 ← phi( @18/(word) 1024 @20/(byte[1000]) SCREEN#1 ) - (byte*) RASTER#5 ← phi( @18/(word) 53266 @20/(byte*) RASTER#10 ) - to:@2 -@2: from @1 @6 - (byte[256]) buffer2#12 ← phi( @1/(byte[256]) buffer2#13 @6/(byte[256]) buffer2#15 ) - (byte[256]) buffer1#19 ← phi( @1/(byte[256]) buffer1#20 @6/(byte[256]) buffer1#10 ) - (byte[1000]) SCREEN#8 ← phi( @1/(byte[1000]) SCREEN#9 @6/(byte[1000]) SCREEN#1 ) - (byte) c#6 ← phi( @1/(byte) 25 @6/(byte) c#1 ) - (byte*) RASTER#3 ← phi( @1/(byte*) RASTER#5 @6/(byte*) RASTER#10 ) - to:@3 -@3: from @2 @3 - (byte[256]) buffer1#17 ← phi( @2/(byte[256]) buffer1#19 @3/(byte[256]) buffer1#17 ) - (byte[256]) buffer2#10 ← phi( @2/(byte[256]) buffer2#12 @3/(byte[256]) buffer2#10 ) - (byte[1000]) SCREEN#6 ← phi( @2/(byte[1000]) SCREEN#8 @3/(byte[1000]) SCREEN#6 ) - (byte) c#4 ← phi( @2/(byte) c#6 @3/(byte) c#4 ) - (byte*) RASTER#1 ← phi( @2/(byte*) RASTER#3 @3/(byte*) RASTER#1 ) - (byte~) $1 ← * (byte*) RASTER#1 - (boolean~) $2 ← (byte~) $1 != (byte) 254 - if((boolean~) $2) goto @3 - to:@5 -@5: from @3 - to:@4 -@4: from @4 @5 - (byte[256]) buffer1#10 ← phi( @4/(byte[256]) buffer1#10 @5/(byte[256]) buffer1#17 ) - (byte[256]) buffer2#15 ← phi( @4/(byte[256]) buffer2#15 @5/(byte[256]) buffer2#10 ) - (byte[1000]) SCREEN#1 ← phi( @4/(byte[1000]) SCREEN#1 @5/(byte[1000]) SCREEN#6 ) - (byte) c#2 ← phi( @4/(byte) c#2 @5/(byte) c#4 ) - (byte*) RASTER#10 ← phi( @4/(byte*) RASTER#10 @5/(byte*) RASTER#1 ) - (byte~) $3 ← * (byte*) RASTER#10 - (boolean~) $4 ← (byte~) $3 != (byte) 255 - if((boolean~) $4) goto @4 - to:@6 -@6: from @4 - (byte) c#1 ← -- (byte) c#2 - (boolean~) $5 ← (byte) c#1 != (byte) 0 - if((boolean~) $5) goto @2 - to:@7 -@7: from @6 - call flip param-assignment - to:@19 -@19: from @7 - call plot param-assignment - to:@20 -@20: from @19 - if(true) goto @1 + call main param-assignment to:@END -prepare: from @BEGIN +main: from @BEGIN + call prepare param-assignment + to:@16 +@16: from main + to:main::@1 +main::@1: from @16 @18 + (byte[256]) buffer1#21 ← phi( @16/(word) 4096 @18/(byte[256]) buffer1#11 ) + (byte[256]) buffer2#13 ← phi( @16/(word) 4352 @18/(byte[256]) buffer2#15 ) + (byte[1000]) SCREEN#9 ← phi( @16/(word) 1024 @18/(byte[1000]) SCREEN#1 ) + (byte*) RASTER#6 ← phi( @16/(word) 53266 @18/(byte*) RASTER#10 ) + to:main::@2 +main::@2: from @2 main::@1 + (byte[256]) buffer2#12 ← phi( @2/(byte[256]) buffer2#15 main::@1/(byte[256]) buffer2#13 ) + (byte[256]) buffer1#20 ← phi( @2/(byte[256]) buffer1#11 main::@1/(byte[256]) buffer1#21 ) + (byte[1000]) SCREEN#8 ← phi( @2/(byte[1000]) SCREEN#1 main::@1/(byte[1000]) SCREEN#9 ) + (byte) main::c#6 ← phi( @2/(byte) main::c#1 main::@1/(byte) 25 ) + (byte*) RASTER#3 ← phi( @2/(byte*) RASTER#10 main::@1/(byte*) RASTER#6 ) + to:main::@3 +main::@3: from main::@2 main::@3 + (byte[256]) buffer1#18 ← phi( main::@2/(byte[256]) buffer1#20 main::@3/(byte[256]) buffer1#18 ) + (byte[256]) buffer2#10 ← phi( main::@2/(byte[256]) buffer2#12 main::@3/(byte[256]) buffer2#10 ) + (byte[1000]) SCREEN#6 ← phi( main::@2/(byte[1000]) SCREEN#8 main::@3/(byte[1000]) SCREEN#6 ) + (byte) main::c#4 ← phi( main::@2/(byte) main::c#6 main::@3/(byte) main::c#4 ) + (byte*) RASTER#1 ← phi( main::@2/(byte*) RASTER#3 main::@3/(byte*) RASTER#1 ) + (byte~) main::$1 ← * (byte*) RASTER#1 + (boolean~) main::$2 ← (byte~) main::$1 != (byte) 254 + if((boolean~) main::$2) goto main::@3 + to:@1 +@1: from main::@3 + to:main::@4 +main::@4: from @1 main::@4 + (byte[256]) buffer1#11 ← phi( @1/(byte[256]) buffer1#18 main::@4/(byte[256]) buffer1#11 ) + (byte[256]) buffer2#15 ← phi( @1/(byte[256]) buffer2#10 main::@4/(byte[256]) buffer2#15 ) + (byte[1000]) SCREEN#1 ← phi( @1/(byte[1000]) SCREEN#6 main::@4/(byte[1000]) SCREEN#1 ) + (byte) main::c#2 ← phi( @1/(byte) main::c#4 main::@4/(byte) main::c#2 ) + (byte*) RASTER#10 ← phi( @1/(byte*) RASTER#1 main::@4/(byte*) RASTER#10 ) + (byte~) main::$3 ← * (byte*) RASTER#10 + (boolean~) main::$4 ← (byte~) main::$3 != (byte) 255 + if((boolean~) main::$4) goto main::@4 + to:@2 +@2: from main::@4 + (byte) main::c#1 ← -- (byte) main::c#2 + (boolean~) main::$5 ← (byte) main::c#1 != (byte) 0 + if((boolean~) main::$5) goto main::@2 + to:@3 +@3: from @2 + call flip param-assignment + to:@17 +@17: from @3 + call plot param-assignment + to:@18 +@18: from @17 + if(true) goto main::@1 + to:main::@return +main::@return: from @18 + return + to:@RETURN +prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 (byte[256]) buffer1#1 ← phi( prepare/(word) 4096 prepare::@1/(byte[256]) buffer1#1 ) @@ -1793,14 +1897,14 @@ prepare::@1: from prepare prepare::@1 prepare::@return: from prepare::@1 return to:@RETURN -flip: from @7 +flip: from @3 to:flip::@1 -flip::@1: from @11 flip - (byte) flip::r#4 ← phi( @11/(byte) flip::r#1 flip/(byte) 16 ) - (byte[256]) buffer1#6 ← phi( @11/(byte[256]) buffer1#2 flip/(byte[256]) buffer1#10 ) - (byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#1 flip/(byte) 0 ) - (byte[256]) buffer2#3 ← phi( @11/(byte[256]) buffer2#1 flip/(byte[256]) buffer2#15 ) - (byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) 15 ) +flip::@1: from @8 flip + (byte) flip::r#4 ← phi( @8/(byte) flip::r#1 flip/(byte) 16 ) + (byte[256]) buffer1#6 ← phi( @8/(byte[256]) buffer1#10 flip/(byte[256]) buffer1#11 ) + (byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#1 flip/(byte) 0 ) + (byte[256]) buffer2#3 ← phi( @8/(byte[256]) buffer2#1 flip/(byte[256]) buffer2#15 ) + (byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) 15 ) to:flip::@2 flip::@2: from flip::@1 flip::@2 (byte) flip::r#2 ← phi( flip::@1/(byte) flip::r#4 flip::@2/(byte) flip::r#2 ) @@ -1808,27 +1912,27 @@ flip::@2: from flip::@1 flip::@2 (byte) flip::dstIdx#3 ← phi( flip::@1/(byte) flip::dstIdx#5 flip::@2/(byte) flip::dstIdx#1 ) (byte[256]) buffer2#1 ← phi( flip::@1/(byte[256]) buffer2#3 flip::@2/(byte[256]) buffer2#1 ) (byte) flip::srcIdx#2 ← phi( flip::@1/(byte) flip::srcIdx#3 flip::@2/(byte) flip::srcIdx#1 ) - (byte[256]) buffer1#2 ← phi( flip::@1/(byte[256]) buffer1#6 flip::@2/(byte[256]) buffer1#2 ) - (byte~) flip::$0 ← (byte[256]) buffer1#2 *idx (byte) flip::srcIdx#2 + (byte[256]) buffer1#10 ← phi( flip::@1/(byte[256]) buffer1#6 flip::@2/(byte[256]) buffer1#10 ) + (byte~) flip::$0 ← (byte[256]) buffer1#10 *idx (byte) flip::srcIdx#2 *((byte[256]) buffer2#1 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 (byte) flip::c#1 ← -- (byte) flip::c#2 (boolean~) flip::$2 ← (byte) flip::c#1 != (byte) 0 if((boolean~) flip::$2) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 (byte) flip::r#1 ← -- (byte) flip::r#2 (boolean~) flip::$3 ← (byte) flip::r#1 != (byte) 0 if((boolean~) flip::$3) goto flip::@1 - to:@12 -@12: from @11 + to:@9 +@9: from @8 to:flip::@3 -flip::@3: from @12 flip::@3 - (byte[256]) buffer1#3 ← phi( @12/(byte[256]) buffer1#2 flip::@3/(byte[256]) buffer1#3 ) - (byte) flip::i#2 ← phi( @12/(byte) 0 flip::@3/(byte) flip::i#1 ) - (byte[256]) buffer2#2 ← phi( @12/(byte[256]) buffer2#1 flip::@3/(byte[256]) buffer2#2 ) +flip::@3: from @9 flip::@3 + (byte[256]) buffer1#3 ← phi( @9/(byte[256]) buffer1#10 flip::@3/(byte[256]) buffer1#3 ) + (byte) flip::i#2 ← phi( @9/(byte) 0 flip::@3/(byte) flip::i#1 ) + (byte[256]) buffer2#2 ← phi( @9/(byte[256]) buffer2#1 flip::@3/(byte[256]) buffer2#2 ) (byte~) flip::$4 ← (byte[256]) buffer2#2 *idx (byte) flip::i#2 *((byte[256]) buffer1#3 + (byte) flip::i#2) ← (byte~) flip::$4 (byte) flip::i#1 ← ++ (byte) flip::i#2 @@ -1838,115 +1942,121 @@ flip::@3: from @12 flip::@3 flip::@return: from flip::@3 return to:@RETURN -plot: from @19 +plot: from @17 (byte*) plot::line#0 ← (byte[1000]) SCREEN#1 + (byte) 212 to:plot::@1 -plot::@1: from @15 plot - (byte) plot::y#4 ← phi( @15/(byte) plot::y#1 plot/(byte) 16 ) - (byte[256]) buffer1#8 ← phi( @15/(byte[256]) buffer1#11 plot/(byte[256]) buffer1#10 ) - (byte) plot::i#3 ← phi( @15/(byte) plot::i#1 plot/(byte) 0 ) - (byte*) plot::line#4 ← phi( @15/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) +plot::@1: from @12 plot + (byte) plot::y#4 ← phi( @12/(byte) plot::y#1 plot/(byte) 16 ) + (byte[256]) buffer1#8 ← phi( @12/(byte[256]) buffer1#12 plot/(byte[256]) buffer1#11 ) + (byte) plot::i#3 ← phi( @12/(byte) plot::i#1 plot/(byte) 0 ) + (byte*) plot::line#4 ← phi( @12/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) to:plot::@2 plot::@2: from plot::@1 plot::@2 (byte) plot::y#2 ← phi( plot::@1/(byte) plot::y#4 plot::@2/(byte) plot::y#2 ) (byte) plot::x#2 ← phi( plot::@1/(byte) 0 plot::@2/(byte) plot::x#1 ) (byte*) plot::line#2 ← phi( plot::@1/(byte*) plot::line#4 plot::@2/(byte*) plot::line#2 ) (byte) plot::i#2 ← phi( plot::@1/(byte) plot::i#3 plot::@2/(byte) plot::i#1 ) - (byte[256]) buffer1#11 ← phi( plot::@1/(byte[256]) buffer1#8 plot::@2/(byte[256]) buffer1#11 ) - (byte~) plot::$3 ← (byte[256]) buffer1#11 *idx (byte) plot::i#2 + (byte[256]) buffer1#12 ← phi( plot::@1/(byte[256]) buffer1#8 plot::@2/(byte[256]) buffer1#12 ) + (byte~) plot::$3 ← (byte[256]) buffer1#12 *idx (byte) plot::i#2 *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 (byte) plot::i#1 ← ++ (byte) plot::i#2 (byte) plot::x#1 ← ++ (byte) plot::x#2 (boolean~) plot::$4 ← (byte) plot::x#1 < (byte) 16 if((boolean~) plot::$4) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 (byte) plot::y#1 ← -- (byte) plot::y#2 (boolean~) plot::$6 ← (byte) plot::y#1 != (byte) 0 if((boolean~) plot::$6) goto plot::@1 to:plot::@return -plot::@return: from @15 +plot::@return: from @12 return to:@RETURN -@END: from @20 +@END: from @BEGIN -Self Phi Eliminated (byte[256]) buffer1#17 +Self Phi Eliminated (byte[256]) buffer1#18 Self Phi Eliminated (byte[256]) buffer2#10 Self Phi Eliminated (byte[1000]) SCREEN#6 -Self Phi Eliminated (byte) c#4 +Self Phi Eliminated (byte) main::c#4 Self Phi Eliminated (byte*) RASTER#1 -Self Phi Eliminated (byte[256]) buffer1#10 +Self Phi Eliminated (byte[256]) buffer1#11 Self Phi Eliminated (byte[256]) buffer2#15 Self Phi Eliminated (byte[1000]) SCREEN#1 -Self Phi Eliminated (byte) c#2 +Self Phi Eliminated (byte) main::c#2 Self Phi Eliminated (byte*) RASTER#10 Self Phi Eliminated (byte[256]) buffer1#1 Self Phi Eliminated (byte) flip::r#2 Self Phi Eliminated (byte[256]) buffer2#1 -Self Phi Eliminated (byte[256]) buffer1#2 +Self Phi Eliminated (byte[256]) buffer1#10 Self Phi Eliminated (byte[256]) buffer1#3 Self Phi Eliminated (byte[256]) buffer2#2 Self Phi Eliminated (byte) plot::y#2 Self Phi Eliminated (byte*) plot::line#2 -Self Phi Eliminated (byte[256]) buffer1#11 +Self Phi Eliminated (byte[256]) buffer1#12 Succesful SSA optimization Pass2SelfPhiElimination CONTROL FLOW GRAPH @BEGIN: from - call prepare param-assignment - to:@18 -@18: from @BEGIN - to:@1 -@1: from @18 @20 - (byte[256]) buffer1#20 ← phi( @18/(word) 4096 @20/(byte[256]) buffer1#10 ) - (byte[256]) buffer2#13 ← phi( @18/(word) 4352 @20/(byte[256]) buffer2#15 ) - (byte[1000]) SCREEN#9 ← phi( @18/(word) 1024 @20/(byte[1000]) SCREEN#1 ) - (byte*) RASTER#5 ← phi( @18/(word) 53266 @20/(byte*) RASTER#10 ) - to:@2 -@2: from @1 @6 - (byte[256]) buffer2#12 ← phi( @1/(byte[256]) buffer2#13 @6/(byte[256]) buffer2#15 ) - (byte[256]) buffer1#19 ← phi( @1/(byte[256]) buffer1#20 @6/(byte[256]) buffer1#10 ) - (byte[1000]) SCREEN#8 ← phi( @1/(byte[1000]) SCREEN#9 @6/(byte[1000]) SCREEN#1 ) - (byte) c#6 ← phi( @1/(byte) 25 @6/(byte) c#1 ) - (byte*) RASTER#3 ← phi( @1/(byte*) RASTER#5 @6/(byte*) RASTER#10 ) - to:@3 -@3: from @2 @3 - (byte[256]) buffer1#17 ← phi( @2/(byte[256]) buffer1#19 ) - (byte[256]) buffer2#10 ← phi( @2/(byte[256]) buffer2#12 ) - (byte[1000]) SCREEN#6 ← phi( @2/(byte[1000]) SCREEN#8 ) - (byte) c#4 ← phi( @2/(byte) c#6 ) - (byte*) RASTER#1 ← phi( @2/(byte*) RASTER#3 ) - (byte~) $1 ← * (byte*) RASTER#1 - (boolean~) $2 ← (byte~) $1 != (byte) 254 - if((boolean~) $2) goto @3 - to:@5 -@5: from @3 - to:@4 -@4: from @4 @5 - (byte[256]) buffer1#10 ← phi( @5/(byte[256]) buffer1#17 ) - (byte[256]) buffer2#15 ← phi( @5/(byte[256]) buffer2#10 ) - (byte[1000]) SCREEN#1 ← phi( @5/(byte[1000]) SCREEN#6 ) - (byte) c#2 ← phi( @5/(byte) c#4 ) - (byte*) RASTER#10 ← phi( @5/(byte*) RASTER#1 ) - (byte~) $3 ← * (byte*) RASTER#10 - (boolean~) $4 ← (byte~) $3 != (byte) 255 - if((boolean~) $4) goto @4 - to:@6 -@6: from @4 - (byte) c#1 ← -- (byte) c#2 - (boolean~) $5 ← (byte) c#1 != (byte) 0 - if((boolean~) $5) goto @2 - to:@7 -@7: from @6 - call flip param-assignment - to:@19 -@19: from @7 - call plot param-assignment - to:@20 -@20: from @19 - if(true) goto @1 + call main param-assignment to:@END -prepare: from @BEGIN +main: from @BEGIN + call prepare param-assignment + to:@16 +@16: from main + to:main::@1 +main::@1: from @16 @18 + (byte[256]) buffer1#21 ← phi( @16/(word) 4096 @18/(byte[256]) buffer1#11 ) + (byte[256]) buffer2#13 ← phi( @16/(word) 4352 @18/(byte[256]) buffer2#15 ) + (byte[1000]) SCREEN#9 ← phi( @16/(word) 1024 @18/(byte[1000]) SCREEN#1 ) + (byte*) RASTER#6 ← phi( @16/(word) 53266 @18/(byte*) RASTER#10 ) + to:main::@2 +main::@2: from @2 main::@1 + (byte[256]) buffer2#12 ← phi( @2/(byte[256]) buffer2#15 main::@1/(byte[256]) buffer2#13 ) + (byte[256]) buffer1#20 ← phi( @2/(byte[256]) buffer1#11 main::@1/(byte[256]) buffer1#21 ) + (byte[1000]) SCREEN#8 ← phi( @2/(byte[1000]) SCREEN#1 main::@1/(byte[1000]) SCREEN#9 ) + (byte) main::c#6 ← phi( @2/(byte) main::c#1 main::@1/(byte) 25 ) + (byte*) RASTER#3 ← phi( @2/(byte*) RASTER#10 main::@1/(byte*) RASTER#6 ) + to:main::@3 +main::@3: from main::@2 main::@3 + (byte[256]) buffer1#18 ← phi( main::@2/(byte[256]) buffer1#20 ) + (byte[256]) buffer2#10 ← phi( main::@2/(byte[256]) buffer2#12 ) + (byte[1000]) SCREEN#6 ← phi( main::@2/(byte[1000]) SCREEN#8 ) + (byte) main::c#4 ← phi( main::@2/(byte) main::c#6 ) + (byte*) RASTER#1 ← phi( main::@2/(byte*) RASTER#3 ) + (byte~) main::$1 ← * (byte*) RASTER#1 + (boolean~) main::$2 ← (byte~) main::$1 != (byte) 254 + if((boolean~) main::$2) goto main::@3 + to:@1 +@1: from main::@3 + to:main::@4 +main::@4: from @1 main::@4 + (byte[256]) buffer1#11 ← phi( @1/(byte[256]) buffer1#18 ) + (byte[256]) buffer2#15 ← phi( @1/(byte[256]) buffer2#10 ) + (byte[1000]) SCREEN#1 ← phi( @1/(byte[1000]) SCREEN#6 ) + (byte) main::c#2 ← phi( @1/(byte) main::c#4 ) + (byte*) RASTER#10 ← phi( @1/(byte*) RASTER#1 ) + (byte~) main::$3 ← * (byte*) RASTER#10 + (boolean~) main::$4 ← (byte~) main::$3 != (byte) 255 + if((boolean~) main::$4) goto main::@4 + to:@2 +@2: from main::@4 + (byte) main::c#1 ← -- (byte) main::c#2 + (boolean~) main::$5 ← (byte) main::c#1 != (byte) 0 + if((boolean~) main::$5) goto main::@2 + to:@3 +@3: from @2 + call flip param-assignment + to:@17 +@17: from @3 + call plot param-assignment + to:@18 +@18: from @17 + if(true) goto main::@1 + to:main::@return +main::@return: from @18 + return + to:@RETURN +prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 (byte[256]) buffer1#1 ← phi( prepare/(word) 4096 ) @@ -1959,14 +2069,14 @@ prepare::@1: from prepare prepare::@1 prepare::@return: from prepare::@1 return to:@RETURN -flip: from @7 +flip: from @3 to:flip::@1 -flip::@1: from @11 flip - (byte) flip::r#4 ← phi( @11/(byte) flip::r#1 flip/(byte) 16 ) - (byte[256]) buffer1#6 ← phi( @11/(byte[256]) buffer1#2 flip/(byte[256]) buffer1#10 ) - (byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#1 flip/(byte) 0 ) - (byte[256]) buffer2#3 ← phi( @11/(byte[256]) buffer2#1 flip/(byte[256]) buffer2#15 ) - (byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) 15 ) +flip::@1: from @8 flip + (byte) flip::r#4 ← phi( @8/(byte) flip::r#1 flip/(byte) 16 ) + (byte[256]) buffer1#6 ← phi( @8/(byte[256]) buffer1#10 flip/(byte[256]) buffer1#11 ) + (byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#1 flip/(byte) 0 ) + (byte[256]) buffer2#3 ← phi( @8/(byte[256]) buffer2#1 flip/(byte[256]) buffer2#15 ) + (byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) 15 ) to:flip::@2 flip::@2: from flip::@1 flip::@2 (byte) flip::r#2 ← phi( flip::@1/(byte) flip::r#4 ) @@ -1974,27 +2084,27 @@ flip::@2: from flip::@1 flip::@2 (byte) flip::dstIdx#3 ← phi( flip::@1/(byte) flip::dstIdx#5 flip::@2/(byte) flip::dstIdx#1 ) (byte[256]) buffer2#1 ← phi( flip::@1/(byte[256]) buffer2#3 ) (byte) flip::srcIdx#2 ← phi( flip::@1/(byte) flip::srcIdx#3 flip::@2/(byte) flip::srcIdx#1 ) - (byte[256]) buffer1#2 ← phi( flip::@1/(byte[256]) buffer1#6 ) - (byte~) flip::$0 ← (byte[256]) buffer1#2 *idx (byte) flip::srcIdx#2 + (byte[256]) buffer1#10 ← phi( flip::@1/(byte[256]) buffer1#6 ) + (byte~) flip::$0 ← (byte[256]) buffer1#10 *idx (byte) flip::srcIdx#2 *((byte[256]) buffer2#1 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 (byte) flip::c#1 ← -- (byte) flip::c#2 (boolean~) flip::$2 ← (byte) flip::c#1 != (byte) 0 if((boolean~) flip::$2) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 (byte) flip::r#1 ← -- (byte) flip::r#2 (boolean~) flip::$3 ← (byte) flip::r#1 != (byte) 0 if((boolean~) flip::$3) goto flip::@1 - to:@12 -@12: from @11 + to:@9 +@9: from @8 to:flip::@3 -flip::@3: from @12 flip::@3 - (byte[256]) buffer1#3 ← phi( @12/(byte[256]) buffer1#2 ) - (byte) flip::i#2 ← phi( @12/(byte) 0 flip::@3/(byte) flip::i#1 ) - (byte[256]) buffer2#2 ← phi( @12/(byte[256]) buffer2#1 ) +flip::@3: from @9 flip::@3 + (byte[256]) buffer1#3 ← phi( @9/(byte[256]) buffer1#10 ) + (byte) flip::i#2 ← phi( @9/(byte) 0 flip::@3/(byte) flip::i#1 ) + (byte[256]) buffer2#2 ← phi( @9/(byte[256]) buffer2#1 ) (byte~) flip::$4 ← (byte[256]) buffer2#2 *idx (byte) flip::i#2 *((byte[256]) buffer1#3 + (byte) flip::i#2) ← (byte~) flip::$4 (byte) flip::i#1 ← ++ (byte) flip::i#2 @@ -2004,42 +2114,42 @@ flip::@3: from @12 flip::@3 flip::@return: from flip::@3 return to:@RETURN -plot: from @19 +plot: from @17 (byte*) plot::line#0 ← (byte[1000]) SCREEN#1 + (byte) 212 to:plot::@1 -plot::@1: from @15 plot - (byte) plot::y#4 ← phi( @15/(byte) plot::y#1 plot/(byte) 16 ) - (byte[256]) buffer1#8 ← phi( @15/(byte[256]) buffer1#11 plot/(byte[256]) buffer1#10 ) - (byte) plot::i#3 ← phi( @15/(byte) plot::i#1 plot/(byte) 0 ) - (byte*) plot::line#4 ← phi( @15/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) +plot::@1: from @12 plot + (byte) plot::y#4 ← phi( @12/(byte) plot::y#1 plot/(byte) 16 ) + (byte[256]) buffer1#8 ← phi( @12/(byte[256]) buffer1#12 plot/(byte[256]) buffer1#11 ) + (byte) plot::i#3 ← phi( @12/(byte) plot::i#1 plot/(byte) 0 ) + (byte*) plot::line#4 ← phi( @12/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) to:plot::@2 plot::@2: from plot::@1 plot::@2 (byte) plot::y#2 ← phi( plot::@1/(byte) plot::y#4 ) (byte) plot::x#2 ← phi( plot::@1/(byte) 0 plot::@2/(byte) plot::x#1 ) (byte*) plot::line#2 ← phi( plot::@1/(byte*) plot::line#4 ) (byte) plot::i#2 ← phi( plot::@1/(byte) plot::i#3 plot::@2/(byte) plot::i#1 ) - (byte[256]) buffer1#11 ← phi( plot::@1/(byte[256]) buffer1#8 ) - (byte~) plot::$3 ← (byte[256]) buffer1#11 *idx (byte) plot::i#2 + (byte[256]) buffer1#12 ← phi( plot::@1/(byte[256]) buffer1#8 ) + (byte~) plot::$3 ← (byte[256]) buffer1#12 *idx (byte) plot::i#2 *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 (byte) plot::i#1 ← ++ (byte) plot::i#2 (byte) plot::x#1 ← ++ (byte) plot::x#2 (boolean~) plot::$4 ← (byte) plot::x#1 < (byte) 16 if((boolean~) plot::$4) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 (byte) plot::y#1 ← -- (byte) plot::y#2 (boolean~) plot::$6 ← (byte) plot::y#1 != (byte) 0 if((boolean~) plot::$6) goto plot::@1 to:plot::@return -plot::@return: from @15 +plot::@return: from @12 return to:@RETURN -@END: from @20 +@END: from @BEGIN -Simple Condition (boolean~) $2 if((byte~) $1!=(byte) 254) goto @3 -Simple Condition (boolean~) $4 if((byte~) $3!=(byte) 255) goto @4 -Simple Condition (boolean~) $5 if((byte) c#1!=(byte) 0) goto @2 +Simple Condition (boolean~) main::$2 if((byte~) main::$1!=(byte) 254) goto main::@3 +Simple Condition (boolean~) main::$4 if((byte~) main::$3!=(byte) 255) goto main::@4 +Simple Condition (boolean~) main::$5 if((byte) main::c#1!=(byte) 0) goto main::@2 Simple Condition (boolean~) prepare::$0 if((byte) prepare::i#1!=(byte) 0) goto prepare::@1 Simple Condition (boolean~) flip::$2 if((byte) flip::c#1!=(byte) 0) goto flip::@2 Simple Condition (boolean~) flip::$3 if((byte) flip::r#1!=(byte) 0) goto flip::@1 @@ -2049,57 +2159,63 @@ Simple Condition (boolean~) plot::$6 if((byte) plot::y#1!=(byte) 0) goto plot::@ Succesful SSA optimization Pass2ConditionalJumpSimplification CONTROL FLOW GRAPH @BEGIN: from - call prepare param-assignment - to:@18 -@18: from @BEGIN - to:@1 -@1: from @18 @20 - (byte[256]) buffer1#20 ← phi( @18/(word) 4096 @20/(byte[256]) buffer1#10 ) - (byte[256]) buffer2#13 ← phi( @18/(word) 4352 @20/(byte[256]) buffer2#15 ) - (byte[1000]) SCREEN#9 ← phi( @18/(word) 1024 @20/(byte[1000]) SCREEN#1 ) - (byte*) RASTER#5 ← phi( @18/(word) 53266 @20/(byte*) RASTER#10 ) - to:@2 -@2: from @1 @6 - (byte[256]) buffer2#12 ← phi( @1/(byte[256]) buffer2#13 @6/(byte[256]) buffer2#15 ) - (byte[256]) buffer1#19 ← phi( @1/(byte[256]) buffer1#20 @6/(byte[256]) buffer1#10 ) - (byte[1000]) SCREEN#8 ← phi( @1/(byte[1000]) SCREEN#9 @6/(byte[1000]) SCREEN#1 ) - (byte) c#6 ← phi( @1/(byte) 25 @6/(byte) c#1 ) - (byte*) RASTER#3 ← phi( @1/(byte*) RASTER#5 @6/(byte*) RASTER#10 ) - to:@3 -@3: from @2 @3 - (byte[256]) buffer1#17 ← phi( @2/(byte[256]) buffer1#19 ) - (byte[256]) buffer2#10 ← phi( @2/(byte[256]) buffer2#12 ) - (byte[1000]) SCREEN#6 ← phi( @2/(byte[1000]) SCREEN#8 ) - (byte) c#4 ← phi( @2/(byte) c#6 ) - (byte*) RASTER#1 ← phi( @2/(byte*) RASTER#3 ) - (byte~) $1 ← * (byte*) RASTER#1 - if((byte~) $1!=(byte) 254) goto @3 - to:@5 -@5: from @3 - to:@4 -@4: from @4 @5 - (byte[256]) buffer1#10 ← phi( @5/(byte[256]) buffer1#17 ) - (byte[256]) buffer2#15 ← phi( @5/(byte[256]) buffer2#10 ) - (byte[1000]) SCREEN#1 ← phi( @5/(byte[1000]) SCREEN#6 ) - (byte) c#2 ← phi( @5/(byte) c#4 ) - (byte*) RASTER#10 ← phi( @5/(byte*) RASTER#1 ) - (byte~) $3 ← * (byte*) RASTER#10 - if((byte~) $3!=(byte) 255) goto @4 - to:@6 -@6: from @4 - (byte) c#1 ← -- (byte) c#2 - if((byte) c#1!=(byte) 0) goto @2 - to:@7 -@7: from @6 - call flip param-assignment - to:@19 -@19: from @7 - call plot param-assignment - to:@20 -@20: from @19 - if(true) goto @1 + call main param-assignment to:@END -prepare: from @BEGIN +main: from @BEGIN + call prepare param-assignment + to:@16 +@16: from main + to:main::@1 +main::@1: from @16 @18 + (byte[256]) buffer1#21 ← phi( @16/(word) 4096 @18/(byte[256]) buffer1#11 ) + (byte[256]) buffer2#13 ← phi( @16/(word) 4352 @18/(byte[256]) buffer2#15 ) + (byte[1000]) SCREEN#9 ← phi( @16/(word) 1024 @18/(byte[1000]) SCREEN#1 ) + (byte*) RASTER#6 ← phi( @16/(word) 53266 @18/(byte*) RASTER#10 ) + to:main::@2 +main::@2: from @2 main::@1 + (byte[256]) buffer2#12 ← phi( @2/(byte[256]) buffer2#15 main::@1/(byte[256]) buffer2#13 ) + (byte[256]) buffer1#20 ← phi( @2/(byte[256]) buffer1#11 main::@1/(byte[256]) buffer1#21 ) + (byte[1000]) SCREEN#8 ← phi( @2/(byte[1000]) SCREEN#1 main::@1/(byte[1000]) SCREEN#9 ) + (byte) main::c#6 ← phi( @2/(byte) main::c#1 main::@1/(byte) 25 ) + (byte*) RASTER#3 ← phi( @2/(byte*) RASTER#10 main::@1/(byte*) RASTER#6 ) + to:main::@3 +main::@3: from main::@2 main::@3 + (byte[256]) buffer1#18 ← phi( main::@2/(byte[256]) buffer1#20 ) + (byte[256]) buffer2#10 ← phi( main::@2/(byte[256]) buffer2#12 ) + (byte[1000]) SCREEN#6 ← phi( main::@2/(byte[1000]) SCREEN#8 ) + (byte) main::c#4 ← phi( main::@2/(byte) main::c#6 ) + (byte*) RASTER#1 ← phi( main::@2/(byte*) RASTER#3 ) + (byte~) main::$1 ← * (byte*) RASTER#1 + if((byte~) main::$1!=(byte) 254) goto main::@3 + to:@1 +@1: from main::@3 + to:main::@4 +main::@4: from @1 main::@4 + (byte[256]) buffer1#11 ← phi( @1/(byte[256]) buffer1#18 ) + (byte[256]) buffer2#15 ← phi( @1/(byte[256]) buffer2#10 ) + (byte[1000]) SCREEN#1 ← phi( @1/(byte[1000]) SCREEN#6 ) + (byte) main::c#2 ← phi( @1/(byte) main::c#4 ) + (byte*) RASTER#10 ← phi( @1/(byte*) RASTER#1 ) + (byte~) main::$3 ← * (byte*) RASTER#10 + if((byte~) main::$3!=(byte) 255) goto main::@4 + to:@2 +@2: from main::@4 + (byte) main::c#1 ← -- (byte) main::c#2 + if((byte) main::c#1!=(byte) 0) goto main::@2 + to:@3 +@3: from @2 + call flip param-assignment + to:@17 +@17: from @3 + call plot param-assignment + to:@18 +@18: from @17 + if(true) goto main::@1 + to:main::@return +main::@return: from @18 + return + to:@RETURN +prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 (byte[256]) buffer1#1 ← phi( prepare/(word) 4096 ) @@ -2111,14 +2227,14 @@ prepare::@1: from prepare prepare::@1 prepare::@return: from prepare::@1 return to:@RETURN -flip: from @7 +flip: from @3 to:flip::@1 -flip::@1: from @11 flip - (byte) flip::r#4 ← phi( @11/(byte) flip::r#1 flip/(byte) 16 ) - (byte[256]) buffer1#6 ← phi( @11/(byte[256]) buffer1#2 flip/(byte[256]) buffer1#10 ) - (byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#1 flip/(byte) 0 ) - (byte[256]) buffer2#3 ← phi( @11/(byte[256]) buffer2#1 flip/(byte[256]) buffer2#15 ) - (byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) 15 ) +flip::@1: from @8 flip + (byte) flip::r#4 ← phi( @8/(byte) flip::r#1 flip/(byte) 16 ) + (byte[256]) buffer1#6 ← phi( @8/(byte[256]) buffer1#10 flip/(byte[256]) buffer1#11 ) + (byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#1 flip/(byte) 0 ) + (byte[256]) buffer2#3 ← phi( @8/(byte[256]) buffer2#1 flip/(byte[256]) buffer2#15 ) + (byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) 15 ) to:flip::@2 flip::@2: from flip::@1 flip::@2 (byte) flip::r#2 ← phi( flip::@1/(byte) flip::r#4 ) @@ -2126,25 +2242,25 @@ flip::@2: from flip::@1 flip::@2 (byte) flip::dstIdx#3 ← phi( flip::@1/(byte) flip::dstIdx#5 flip::@2/(byte) flip::dstIdx#1 ) (byte[256]) buffer2#1 ← phi( flip::@1/(byte[256]) buffer2#3 ) (byte) flip::srcIdx#2 ← phi( flip::@1/(byte) flip::srcIdx#3 flip::@2/(byte) flip::srcIdx#1 ) - (byte[256]) buffer1#2 ← phi( flip::@1/(byte[256]) buffer1#6 ) - (byte~) flip::$0 ← (byte[256]) buffer1#2 *idx (byte) flip::srcIdx#2 + (byte[256]) buffer1#10 ← phi( flip::@1/(byte[256]) buffer1#6 ) + (byte~) flip::$0 ← (byte[256]) buffer1#10 *idx (byte) flip::srcIdx#2 *((byte[256]) buffer2#1 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 (byte) flip::c#1 ← -- (byte) flip::c#2 if((byte) flip::c#1!=(byte) 0) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 (byte) flip::r#1 ← -- (byte) flip::r#2 if((byte) flip::r#1!=(byte) 0) goto flip::@1 - to:@12 -@12: from @11 + to:@9 +@9: from @8 to:flip::@3 -flip::@3: from @12 flip::@3 - (byte[256]) buffer1#3 ← phi( @12/(byte[256]) buffer1#2 ) - (byte) flip::i#2 ← phi( @12/(byte) 0 flip::@3/(byte) flip::i#1 ) - (byte[256]) buffer2#2 ← phi( @12/(byte[256]) buffer2#1 ) +flip::@3: from @9 flip::@3 + (byte[256]) buffer1#3 ← phi( @9/(byte[256]) buffer1#10 ) + (byte) flip::i#2 ← phi( @9/(byte) 0 flip::@3/(byte) flip::i#1 ) + (byte[256]) buffer2#2 ← phi( @9/(byte[256]) buffer2#1 ) (byte~) flip::$4 ← (byte[256]) buffer2#2 *idx (byte) flip::i#2 *((byte[256]) buffer1#3 + (byte) flip::i#2) ← (byte~) flip::$4 (byte) flip::i#1 ← ++ (byte) flip::i#2 @@ -2153,90 +2269,96 @@ flip::@3: from @12 flip::@3 flip::@return: from flip::@3 return to:@RETURN -plot: from @19 +plot: from @17 (byte*) plot::line#0 ← (byte[1000]) SCREEN#1 + (byte) 212 to:plot::@1 -plot::@1: from @15 plot - (byte) plot::y#4 ← phi( @15/(byte) plot::y#1 plot/(byte) 16 ) - (byte[256]) buffer1#8 ← phi( @15/(byte[256]) buffer1#11 plot/(byte[256]) buffer1#10 ) - (byte) plot::i#3 ← phi( @15/(byte) plot::i#1 plot/(byte) 0 ) - (byte*) plot::line#4 ← phi( @15/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) +plot::@1: from @12 plot + (byte) plot::y#4 ← phi( @12/(byte) plot::y#1 plot/(byte) 16 ) + (byte[256]) buffer1#8 ← phi( @12/(byte[256]) buffer1#12 plot/(byte[256]) buffer1#11 ) + (byte) plot::i#3 ← phi( @12/(byte) plot::i#1 plot/(byte) 0 ) + (byte*) plot::line#4 ← phi( @12/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) to:plot::@2 plot::@2: from plot::@1 plot::@2 (byte) plot::y#2 ← phi( plot::@1/(byte) plot::y#4 ) (byte) plot::x#2 ← phi( plot::@1/(byte) 0 plot::@2/(byte) plot::x#1 ) (byte*) plot::line#2 ← phi( plot::@1/(byte*) plot::line#4 ) (byte) plot::i#2 ← phi( plot::@1/(byte) plot::i#3 plot::@2/(byte) plot::i#1 ) - (byte[256]) buffer1#11 ← phi( plot::@1/(byte[256]) buffer1#8 ) - (byte~) plot::$3 ← (byte[256]) buffer1#11 *idx (byte) plot::i#2 + (byte[256]) buffer1#12 ← phi( plot::@1/(byte[256]) buffer1#8 ) + (byte~) plot::$3 ← (byte[256]) buffer1#12 *idx (byte) plot::i#2 *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 (byte) plot::i#1 ← ++ (byte) plot::i#2 (byte) plot::x#1 ← ++ (byte) plot::x#2 if((byte) plot::x#1<(byte) 16) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 (byte) plot::y#1 ← -- (byte) plot::y#2 if((byte) plot::y#1!=(byte) 0) goto plot::@1 to:plot::@return -plot::@return: from @15 +plot::@return: from @12 return to:@RETURN -@END: from @20 +@END: from @BEGIN -Culled Empty Block (label) @18 -Culled Empty Block (label) @5 -Culled Empty Block (label) @12 +Culled Empty Block (label) @16 +Culled Empty Block (label) @1 +Culled Empty Block (label) @9 Succesful SSA optimization Pass2CullEmptyBlocks CONTROL FLOW GRAPH @BEGIN: from - call prepare param-assignment - to:@1 -@1: from @20 @BEGIN - (byte[256]) buffer1#20 ← phi( @BEGIN/(word) 4096 @20/(byte[256]) buffer1#10 ) - (byte[256]) buffer2#13 ← phi( @BEGIN/(word) 4352 @20/(byte[256]) buffer2#15 ) - (byte[1000]) SCREEN#9 ← phi( @BEGIN/(word) 1024 @20/(byte[1000]) SCREEN#1 ) - (byte*) RASTER#5 ← phi( @BEGIN/(word) 53266 @20/(byte*) RASTER#10 ) - to:@2 -@2: from @1 @6 - (byte[256]) buffer2#12 ← phi( @1/(byte[256]) buffer2#13 @6/(byte[256]) buffer2#15 ) - (byte[256]) buffer1#19 ← phi( @1/(byte[256]) buffer1#20 @6/(byte[256]) buffer1#10 ) - (byte[1000]) SCREEN#8 ← phi( @1/(byte[1000]) SCREEN#9 @6/(byte[1000]) SCREEN#1 ) - (byte) c#6 ← phi( @1/(byte) 25 @6/(byte) c#1 ) - (byte*) RASTER#3 ← phi( @1/(byte*) RASTER#5 @6/(byte*) RASTER#10 ) - to:@3 -@3: from @2 @3 - (byte[256]) buffer1#17 ← phi( @2/(byte[256]) buffer1#19 ) - (byte[256]) buffer2#10 ← phi( @2/(byte[256]) buffer2#12 ) - (byte[1000]) SCREEN#6 ← phi( @2/(byte[1000]) SCREEN#8 ) - (byte) c#4 ← phi( @2/(byte) c#6 ) - (byte*) RASTER#1 ← phi( @2/(byte*) RASTER#3 ) - (byte~) $1 ← * (byte*) RASTER#1 - if((byte~) $1!=(byte) 254) goto @3 - to:@4 -@4: from @3 @4 - (byte[256]) buffer1#10 ← phi( @3/(byte[256]) buffer1#17 ) - (byte[256]) buffer2#15 ← phi( @3/(byte[256]) buffer2#10 ) - (byte[1000]) SCREEN#1 ← phi( @3/(byte[1000]) SCREEN#6 ) - (byte) c#2 ← phi( @3/(byte) c#4 ) - (byte*) RASTER#10 ← phi( @3/(byte*) RASTER#1 ) - (byte~) $3 ← * (byte*) RASTER#10 - if((byte~) $3!=(byte) 255) goto @4 - to:@6 -@6: from @4 - (byte) c#1 ← -- (byte) c#2 - if((byte) c#1!=(byte) 0) goto @2 - to:@7 -@7: from @6 - call flip param-assignment - to:@19 -@19: from @7 - call plot param-assignment - to:@20 -@20: from @19 - if(true) goto @1 + call main param-assignment to:@END -prepare: from @BEGIN +main: from @BEGIN + call prepare param-assignment + to:main::@1 +main::@1: from @18 main + (byte[256]) buffer1#21 ← phi( main/(word) 4096 @18/(byte[256]) buffer1#11 ) + (byte[256]) buffer2#13 ← phi( main/(word) 4352 @18/(byte[256]) buffer2#15 ) + (byte[1000]) SCREEN#9 ← phi( main/(word) 1024 @18/(byte[1000]) SCREEN#1 ) + (byte*) RASTER#6 ← phi( main/(word) 53266 @18/(byte*) RASTER#10 ) + to:main::@2 +main::@2: from @2 main::@1 + (byte[256]) buffer2#12 ← phi( @2/(byte[256]) buffer2#15 main::@1/(byte[256]) buffer2#13 ) + (byte[256]) buffer1#20 ← phi( @2/(byte[256]) buffer1#11 main::@1/(byte[256]) buffer1#21 ) + (byte[1000]) SCREEN#8 ← phi( @2/(byte[1000]) SCREEN#1 main::@1/(byte[1000]) SCREEN#9 ) + (byte) main::c#6 ← phi( @2/(byte) main::c#1 main::@1/(byte) 25 ) + (byte*) RASTER#3 ← phi( @2/(byte*) RASTER#10 main::@1/(byte*) RASTER#6 ) + to:main::@3 +main::@3: from main::@2 main::@3 + (byte[256]) buffer1#18 ← phi( main::@2/(byte[256]) buffer1#20 ) + (byte[256]) buffer2#10 ← phi( main::@2/(byte[256]) buffer2#12 ) + (byte[1000]) SCREEN#6 ← phi( main::@2/(byte[1000]) SCREEN#8 ) + (byte) main::c#4 ← phi( main::@2/(byte) main::c#6 ) + (byte*) RASTER#1 ← phi( main::@2/(byte*) RASTER#3 ) + (byte~) main::$1 ← * (byte*) RASTER#1 + if((byte~) main::$1!=(byte) 254) goto main::@3 + to:main::@4 +main::@4: from main::@3 main::@4 + (byte[256]) buffer1#11 ← phi( main::@3/(byte[256]) buffer1#18 ) + (byte[256]) buffer2#15 ← phi( main::@3/(byte[256]) buffer2#10 ) + (byte[1000]) SCREEN#1 ← phi( main::@3/(byte[1000]) SCREEN#6 ) + (byte) main::c#2 ← phi( main::@3/(byte) main::c#4 ) + (byte*) RASTER#10 ← phi( main::@3/(byte*) RASTER#1 ) + (byte~) main::$3 ← * (byte*) RASTER#10 + if((byte~) main::$3!=(byte) 255) goto main::@4 + to:@2 +@2: from main::@4 + (byte) main::c#1 ← -- (byte) main::c#2 + if((byte) main::c#1!=(byte) 0) goto main::@2 + to:@3 +@3: from @2 + call flip param-assignment + to:@17 +@17: from @3 + call plot param-assignment + to:@18 +@18: from @17 + if(true) goto main::@1 + to:main::@return +main::@return: from @18 + return + to:@RETURN +prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 (byte[256]) buffer1#1 ← phi( prepare/(word) 4096 ) @@ -2248,14 +2370,14 @@ prepare::@1: from prepare prepare::@1 prepare::@return: from prepare::@1 return to:@RETURN -flip: from @7 +flip: from @3 to:flip::@1 -flip::@1: from @11 flip - (byte) flip::r#4 ← phi( @11/(byte) flip::r#1 flip/(byte) 16 ) - (byte[256]) buffer1#6 ← phi( @11/(byte[256]) buffer1#2 flip/(byte[256]) buffer1#10 ) - (byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#1 flip/(byte) 0 ) - (byte[256]) buffer2#3 ← phi( @11/(byte[256]) buffer2#1 flip/(byte[256]) buffer2#15 ) - (byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) 15 ) +flip::@1: from @8 flip + (byte) flip::r#4 ← phi( @8/(byte) flip::r#1 flip/(byte) 16 ) + (byte[256]) buffer1#6 ← phi( @8/(byte[256]) buffer1#10 flip/(byte[256]) buffer1#11 ) + (byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#1 flip/(byte) 0 ) + (byte[256]) buffer2#3 ← phi( @8/(byte[256]) buffer2#1 flip/(byte[256]) buffer2#15 ) + (byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) 15 ) to:flip::@2 flip::@2: from flip::@1 flip::@2 (byte) flip::r#2 ← phi( flip::@1/(byte) flip::r#4 ) @@ -2263,23 +2385,23 @@ flip::@2: from flip::@1 flip::@2 (byte) flip::dstIdx#3 ← phi( flip::@1/(byte) flip::dstIdx#5 flip::@2/(byte) flip::dstIdx#1 ) (byte[256]) buffer2#1 ← phi( flip::@1/(byte[256]) buffer2#3 ) (byte) flip::srcIdx#2 ← phi( flip::@1/(byte) flip::srcIdx#3 flip::@2/(byte) flip::srcIdx#1 ) - (byte[256]) buffer1#2 ← phi( flip::@1/(byte[256]) buffer1#6 ) - (byte~) flip::$0 ← (byte[256]) buffer1#2 *idx (byte) flip::srcIdx#2 + (byte[256]) buffer1#10 ← phi( flip::@1/(byte[256]) buffer1#6 ) + (byte~) flip::$0 ← (byte[256]) buffer1#10 *idx (byte) flip::srcIdx#2 *((byte[256]) buffer2#1 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 (byte) flip::c#1 ← -- (byte) flip::c#2 if((byte) flip::c#1!=(byte) 0) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 (byte) flip::r#1 ← -- (byte) flip::r#2 if((byte) flip::r#1!=(byte) 0) goto flip::@1 to:flip::@3 -flip::@3: from @11 flip::@3 - (byte[256]) buffer1#3 ← phi( @11/(byte[256]) buffer1#2 ) - (byte) flip::i#2 ← phi( @11/(byte) 0 flip::@3/(byte) flip::i#1 ) - (byte[256]) buffer2#2 ← phi( @11/(byte[256]) buffer2#1 ) +flip::@3: from @8 flip::@3 + (byte[256]) buffer1#3 ← phi( @8/(byte[256]) buffer1#10 ) + (byte) flip::i#2 ← phi( @8/(byte) 0 flip::@3/(byte) flip::i#1 ) + (byte[256]) buffer2#2 ← phi( @8/(byte[256]) buffer2#1 ) (byte~) flip::$4 ← (byte[256]) buffer2#2 *idx (byte) flip::i#2 *((byte[256]) buffer1#3 + (byte) flip::i#2) ← (byte~) flip::$4 (byte) flip::i#1 ← ++ (byte) flip::i#2 @@ -2288,88 +2410,94 @@ flip::@3: from @11 flip::@3 flip::@return: from flip::@3 return to:@RETURN -plot: from @19 +plot: from @17 (byte*) plot::line#0 ← (byte[1000]) SCREEN#1 + (byte) 212 to:plot::@1 -plot::@1: from @15 plot - (byte) plot::y#4 ← phi( @15/(byte) plot::y#1 plot/(byte) 16 ) - (byte[256]) buffer1#8 ← phi( @15/(byte[256]) buffer1#11 plot/(byte[256]) buffer1#10 ) - (byte) plot::i#3 ← phi( @15/(byte) plot::i#1 plot/(byte) 0 ) - (byte*) plot::line#4 ← phi( @15/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) +plot::@1: from @12 plot + (byte) plot::y#4 ← phi( @12/(byte) plot::y#1 plot/(byte) 16 ) + (byte[256]) buffer1#8 ← phi( @12/(byte[256]) buffer1#12 plot/(byte[256]) buffer1#11 ) + (byte) plot::i#3 ← phi( @12/(byte) plot::i#1 plot/(byte) 0 ) + (byte*) plot::line#4 ← phi( @12/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) to:plot::@2 plot::@2: from plot::@1 plot::@2 (byte) plot::y#2 ← phi( plot::@1/(byte) plot::y#4 ) (byte) plot::x#2 ← phi( plot::@1/(byte) 0 plot::@2/(byte) plot::x#1 ) (byte*) plot::line#2 ← phi( plot::@1/(byte*) plot::line#4 ) (byte) plot::i#2 ← phi( plot::@1/(byte) plot::i#3 plot::@2/(byte) plot::i#1 ) - (byte[256]) buffer1#11 ← phi( plot::@1/(byte[256]) buffer1#8 ) - (byte~) plot::$3 ← (byte[256]) buffer1#11 *idx (byte) plot::i#2 + (byte[256]) buffer1#12 ← phi( plot::@1/(byte[256]) buffer1#8 ) + (byte~) plot::$3 ← (byte[256]) buffer1#12 *idx (byte) plot::i#2 *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 (byte) plot::i#1 ← ++ (byte) plot::i#2 (byte) plot::x#1 ← ++ (byte) plot::x#2 if((byte) plot::x#1<(byte) 16) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 (byte) plot::y#1 ← -- (byte) plot::y#2 if((byte) plot::y#1!=(byte) 0) goto plot::@1 to:plot::@return -plot::@return: from @15 +plot::@return: from @12 return to:@RETURN -@END: from @20 +@END: from @BEGIN Constant (byte[256]) buffer1#1 (word) 4096 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH @BEGIN: from - call prepare param-assignment - to:@1 -@1: from @20 @BEGIN - (byte[256]) buffer1#20 ← phi( @BEGIN/(word) 4096 @20/(byte[256]) buffer1#10 ) - (byte[256]) buffer2#13 ← phi( @BEGIN/(word) 4352 @20/(byte[256]) buffer2#15 ) - (byte[1000]) SCREEN#9 ← phi( @BEGIN/(word) 1024 @20/(byte[1000]) SCREEN#1 ) - (byte*) RASTER#5 ← phi( @BEGIN/(word) 53266 @20/(byte*) RASTER#10 ) - to:@2 -@2: from @1 @6 - (byte[256]) buffer2#12 ← phi( @1/(byte[256]) buffer2#13 @6/(byte[256]) buffer2#15 ) - (byte[256]) buffer1#19 ← phi( @1/(byte[256]) buffer1#20 @6/(byte[256]) buffer1#10 ) - (byte[1000]) SCREEN#8 ← phi( @1/(byte[1000]) SCREEN#9 @6/(byte[1000]) SCREEN#1 ) - (byte) c#6 ← phi( @1/(byte) 25 @6/(byte) c#1 ) - (byte*) RASTER#3 ← phi( @1/(byte*) RASTER#5 @6/(byte*) RASTER#10 ) - to:@3 -@3: from @2 @3 - (byte[256]) buffer1#17 ← phi( @2/(byte[256]) buffer1#19 ) - (byte[256]) buffer2#10 ← phi( @2/(byte[256]) buffer2#12 ) - (byte[1000]) SCREEN#6 ← phi( @2/(byte[1000]) SCREEN#8 ) - (byte) c#4 ← phi( @2/(byte) c#6 ) - (byte*) RASTER#1 ← phi( @2/(byte*) RASTER#3 ) - (byte~) $1 ← * (byte*) RASTER#1 - if((byte~) $1!=(byte) 254) goto @3 - to:@4 -@4: from @3 @4 - (byte[256]) buffer1#10 ← phi( @3/(byte[256]) buffer1#17 ) - (byte[256]) buffer2#15 ← phi( @3/(byte[256]) buffer2#10 ) - (byte[1000]) SCREEN#1 ← phi( @3/(byte[1000]) SCREEN#6 ) - (byte) c#2 ← phi( @3/(byte) c#4 ) - (byte*) RASTER#10 ← phi( @3/(byte*) RASTER#1 ) - (byte~) $3 ← * (byte*) RASTER#10 - if((byte~) $3!=(byte) 255) goto @4 - to:@6 -@6: from @4 - (byte) c#1 ← -- (byte) c#2 - if((byte) c#1!=(byte) 0) goto @2 - to:@7 -@7: from @6 - call flip param-assignment - to:@19 -@19: from @7 - call plot param-assignment - to:@20 -@20: from @19 - if(true) goto @1 + call main param-assignment to:@END -prepare: from @BEGIN +main: from @BEGIN + call prepare param-assignment + to:main::@1 +main::@1: from @18 main + (byte[256]) buffer1#21 ← phi( main/(word) 4096 @18/(byte[256]) buffer1#11 ) + (byte[256]) buffer2#13 ← phi( main/(word) 4352 @18/(byte[256]) buffer2#15 ) + (byte[1000]) SCREEN#9 ← phi( main/(word) 1024 @18/(byte[1000]) SCREEN#1 ) + (byte*) RASTER#6 ← phi( main/(word) 53266 @18/(byte*) RASTER#10 ) + to:main::@2 +main::@2: from @2 main::@1 + (byte[256]) buffer2#12 ← phi( @2/(byte[256]) buffer2#15 main::@1/(byte[256]) buffer2#13 ) + (byte[256]) buffer1#20 ← phi( @2/(byte[256]) buffer1#11 main::@1/(byte[256]) buffer1#21 ) + (byte[1000]) SCREEN#8 ← phi( @2/(byte[1000]) SCREEN#1 main::@1/(byte[1000]) SCREEN#9 ) + (byte) main::c#6 ← phi( @2/(byte) main::c#1 main::@1/(byte) 25 ) + (byte*) RASTER#3 ← phi( @2/(byte*) RASTER#10 main::@1/(byte*) RASTER#6 ) + to:main::@3 +main::@3: from main::@2 main::@3 + (byte[256]) buffer1#18 ← phi( main::@2/(byte[256]) buffer1#20 ) + (byte[256]) buffer2#10 ← phi( main::@2/(byte[256]) buffer2#12 ) + (byte[1000]) SCREEN#6 ← phi( main::@2/(byte[1000]) SCREEN#8 ) + (byte) main::c#4 ← phi( main::@2/(byte) main::c#6 ) + (byte*) RASTER#1 ← phi( main::@2/(byte*) RASTER#3 ) + (byte~) main::$1 ← * (byte*) RASTER#1 + if((byte~) main::$1!=(byte) 254) goto main::@3 + to:main::@4 +main::@4: from main::@3 main::@4 + (byte[256]) buffer1#11 ← phi( main::@3/(byte[256]) buffer1#18 ) + (byte[256]) buffer2#15 ← phi( main::@3/(byte[256]) buffer2#10 ) + (byte[1000]) SCREEN#1 ← phi( main::@3/(byte[1000]) SCREEN#6 ) + (byte) main::c#2 ← phi( main::@3/(byte) main::c#4 ) + (byte*) RASTER#10 ← phi( main::@3/(byte*) RASTER#1 ) + (byte~) main::$3 ← * (byte*) RASTER#10 + if((byte~) main::$3!=(byte) 255) goto main::@4 + to:@2 +@2: from main::@4 + (byte) main::c#1 ← -- (byte) main::c#2 + if((byte) main::c#1!=(byte) 0) goto main::@2 + to:@3 +@3: from @2 + call flip param-assignment + to:@17 +@17: from @3 + call plot param-assignment + to:@18 +@18: from @17 + if(true) goto main::@1 + to:main::@return +main::@return: from @18 + return + to:@RETURN +prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 (byte) prepare::i#2 ← phi( prepare/(byte) 0 prepare::@1/(byte) prepare::i#1 ) @@ -2380,14 +2508,14 @@ prepare::@1: from prepare prepare::@1 prepare::@return: from prepare::@1 return to:@RETURN -flip: from @7 +flip: from @3 to:flip::@1 -flip::@1: from @11 flip - (byte) flip::r#4 ← phi( @11/(byte) flip::r#1 flip/(byte) 16 ) - (byte[256]) buffer1#6 ← phi( @11/(byte[256]) buffer1#2 flip/(byte[256]) buffer1#10 ) - (byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#1 flip/(byte) 0 ) - (byte[256]) buffer2#3 ← phi( @11/(byte[256]) buffer2#1 flip/(byte[256]) buffer2#15 ) - (byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) 15 ) +flip::@1: from @8 flip + (byte) flip::r#4 ← phi( @8/(byte) flip::r#1 flip/(byte) 16 ) + (byte[256]) buffer1#6 ← phi( @8/(byte[256]) buffer1#10 flip/(byte[256]) buffer1#11 ) + (byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#1 flip/(byte) 0 ) + (byte[256]) buffer2#3 ← phi( @8/(byte[256]) buffer2#1 flip/(byte[256]) buffer2#15 ) + (byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) 15 ) to:flip::@2 flip::@2: from flip::@1 flip::@2 (byte) flip::r#2 ← phi( flip::@1/(byte) flip::r#4 ) @@ -2395,23 +2523,23 @@ flip::@2: from flip::@1 flip::@2 (byte) flip::dstIdx#3 ← phi( flip::@1/(byte) flip::dstIdx#5 flip::@2/(byte) flip::dstIdx#1 ) (byte[256]) buffer2#1 ← phi( flip::@1/(byte[256]) buffer2#3 ) (byte) flip::srcIdx#2 ← phi( flip::@1/(byte) flip::srcIdx#3 flip::@2/(byte) flip::srcIdx#1 ) - (byte[256]) buffer1#2 ← phi( flip::@1/(byte[256]) buffer1#6 ) - (byte~) flip::$0 ← (byte[256]) buffer1#2 *idx (byte) flip::srcIdx#2 + (byte[256]) buffer1#10 ← phi( flip::@1/(byte[256]) buffer1#6 ) + (byte~) flip::$0 ← (byte[256]) buffer1#10 *idx (byte) flip::srcIdx#2 *((byte[256]) buffer2#1 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 (byte) flip::c#1 ← -- (byte) flip::c#2 if((byte) flip::c#1!=(byte) 0) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 (byte) flip::r#1 ← -- (byte) flip::r#2 if((byte) flip::r#1!=(byte) 0) goto flip::@1 to:flip::@3 -flip::@3: from @11 flip::@3 - (byte[256]) buffer1#3 ← phi( @11/(byte[256]) buffer1#2 ) - (byte) flip::i#2 ← phi( @11/(byte) 0 flip::@3/(byte) flip::i#1 ) - (byte[256]) buffer2#2 ← phi( @11/(byte[256]) buffer2#1 ) +flip::@3: from @8 flip::@3 + (byte[256]) buffer1#3 ← phi( @8/(byte[256]) buffer1#10 ) + (byte) flip::i#2 ← phi( @8/(byte) 0 flip::@3/(byte) flip::i#1 ) + (byte[256]) buffer2#2 ← phi( @8/(byte[256]) buffer2#1 ) (byte~) flip::$4 ← (byte[256]) buffer2#2 *idx (byte) flip::i#2 *((byte[256]) buffer1#3 + (byte) flip::i#2) ← (byte~) flip::$4 (byte) flip::i#1 ← ++ (byte) flip::i#2 @@ -2420,90 +2548,96 @@ flip::@3: from @11 flip::@3 flip::@return: from flip::@3 return to:@RETURN -plot: from @19 +plot: from @17 (byte*) plot::line#0 ← (byte[1000]) SCREEN#1 + (byte) 212 to:plot::@1 -plot::@1: from @15 plot - (byte) plot::y#4 ← phi( @15/(byte) plot::y#1 plot/(byte) 16 ) - (byte[256]) buffer1#8 ← phi( @15/(byte[256]) buffer1#11 plot/(byte[256]) buffer1#10 ) - (byte) plot::i#3 ← phi( @15/(byte) plot::i#1 plot/(byte) 0 ) - (byte*) plot::line#4 ← phi( @15/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) +plot::@1: from @12 plot + (byte) plot::y#4 ← phi( @12/(byte) plot::y#1 plot/(byte) 16 ) + (byte[256]) buffer1#8 ← phi( @12/(byte[256]) buffer1#12 plot/(byte[256]) buffer1#11 ) + (byte) plot::i#3 ← phi( @12/(byte) plot::i#1 plot/(byte) 0 ) + (byte*) plot::line#4 ← phi( @12/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) to:plot::@2 plot::@2: from plot::@1 plot::@2 (byte) plot::y#2 ← phi( plot::@1/(byte) plot::y#4 ) (byte) plot::x#2 ← phi( plot::@1/(byte) 0 plot::@2/(byte) plot::x#1 ) (byte*) plot::line#2 ← phi( plot::@1/(byte*) plot::line#4 ) (byte) plot::i#2 ← phi( plot::@1/(byte) plot::i#3 plot::@2/(byte) plot::i#1 ) - (byte[256]) buffer1#11 ← phi( plot::@1/(byte[256]) buffer1#8 ) - (byte~) plot::$3 ← (byte[256]) buffer1#11 *idx (byte) plot::i#2 + (byte[256]) buffer1#12 ← phi( plot::@1/(byte[256]) buffer1#8 ) + (byte~) plot::$3 ← (byte[256]) buffer1#12 *idx (byte) plot::i#2 *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 (byte) plot::i#1 ← ++ (byte) plot::i#2 (byte) plot::x#1 ← ++ (byte) plot::x#2 if((byte) plot::x#1<(byte) 16) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 (byte) plot::y#1 ← -- (byte) plot::y#2 if((byte) plot::y#1!=(byte) 0) goto plot::@1 to:plot::@return -plot::@return: from @15 +plot::@return: from @12 return to:@RETURN -@END: from @20 +@END: from @BEGIN Multiple usages for variable. Not optimizing sub-constant (byte) prepare::i#2 Multiple usages for variable. Not optimizing sub-constant (byte[1000]) SCREEN#1 -Alias (byte[256]) buffer1#10 = (byte[256]) buffer1#17 (byte[256]) buffer1#19 +Alias (byte[256]) buffer1#11 = (byte[256]) buffer1#18 (byte[256]) buffer1#20 Alias (byte[256]) buffer2#10 = (byte[256]) buffer2#12 (byte[256]) buffer2#15 Alias (byte[1000]) SCREEN#1 = (byte[1000]) SCREEN#6 (byte[1000]) SCREEN#8 -Alias (byte) c#2 = (byte) c#4 (byte) c#6 +Alias (byte) main::c#2 = (byte) main::c#4 (byte) main::c#6 Alias (byte*) RASTER#1 = (byte*) RASTER#3 (byte*) RASTER#10 Alias (byte) flip::r#2 = (byte) flip::r#4 Alias (byte[256]) buffer2#1 = (byte[256]) buffer2#3 (byte[256]) buffer2#2 -Alias (byte[256]) buffer1#2 = (byte[256]) buffer1#6 (byte[256]) buffer1#3 +Alias (byte[256]) buffer1#10 = (byte[256]) buffer1#6 (byte[256]) buffer1#3 Alias (byte) plot::y#2 = (byte) plot::y#4 Alias (byte*) plot::line#2 = (byte*) plot::line#4 -Alias (byte[256]) buffer1#11 = (byte[256]) buffer1#8 +Alias (byte[256]) buffer1#12 = (byte[256]) buffer1#8 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH @BEGIN: from - call prepare param-assignment - to:@1 -@1: from @20 @BEGIN - (byte[256]) buffer1#20 ← phi( @BEGIN/(word) 4096 @20/(byte[256]) buffer1#10 ) - (byte[256]) buffer2#13 ← phi( @BEGIN/(word) 4352 @20/(byte[256]) buffer2#10 ) - (byte[1000]) SCREEN#9 ← phi( @BEGIN/(word) 1024 @20/(byte[1000]) SCREEN#1 ) - (byte*) RASTER#5 ← phi( @BEGIN/(word) 53266 @20/(byte*) RASTER#1 ) - to:@2 -@2: from @1 @6 - (byte[256]) buffer2#10 ← phi( @1/(byte[256]) buffer2#13 @6/(byte[256]) buffer2#10 ) - (byte[256]) buffer1#10 ← phi( @1/(byte[256]) buffer1#20 @6/(byte[256]) buffer1#10 ) - (byte[1000]) SCREEN#1 ← phi( @1/(byte[1000]) SCREEN#9 @6/(byte[1000]) SCREEN#1 ) - (byte) c#2 ← phi( @1/(byte) 25 @6/(byte) c#1 ) - (byte*) RASTER#1 ← phi( @1/(byte*) RASTER#5 @6/(byte*) RASTER#1 ) - to:@3 -@3: from @2 @3 - (byte~) $1 ← * (byte*) RASTER#1 - if((byte~) $1!=(byte) 254) goto @3 - to:@4 -@4: from @3 @4 - (byte~) $3 ← * (byte*) RASTER#1 - if((byte~) $3!=(byte) 255) goto @4 - to:@6 -@6: from @4 - (byte) c#1 ← -- (byte) c#2 - if((byte) c#1!=(byte) 0) goto @2 - to:@7 -@7: from @6 - call flip param-assignment - to:@19 -@19: from @7 - call plot param-assignment - to:@20 -@20: from @19 - if(true) goto @1 + call main param-assignment to:@END -prepare: from @BEGIN +main: from @BEGIN + call prepare param-assignment + to:main::@1 +main::@1: from @18 main + (byte[256]) buffer1#21 ← phi( main/(word) 4096 @18/(byte[256]) buffer1#11 ) + (byte[256]) buffer2#13 ← phi( main/(word) 4352 @18/(byte[256]) buffer2#10 ) + (byte[1000]) SCREEN#9 ← phi( main/(word) 1024 @18/(byte[1000]) SCREEN#1 ) + (byte*) RASTER#6 ← phi( main/(word) 53266 @18/(byte*) RASTER#1 ) + to:main::@2 +main::@2: from @2 main::@1 + (byte[256]) buffer2#10 ← phi( @2/(byte[256]) buffer2#10 main::@1/(byte[256]) buffer2#13 ) + (byte[256]) buffer1#11 ← phi( @2/(byte[256]) buffer1#11 main::@1/(byte[256]) buffer1#21 ) + (byte[1000]) SCREEN#1 ← phi( @2/(byte[1000]) SCREEN#1 main::@1/(byte[1000]) SCREEN#9 ) + (byte) main::c#2 ← phi( @2/(byte) main::c#1 main::@1/(byte) 25 ) + (byte*) RASTER#1 ← phi( @2/(byte*) RASTER#1 main::@1/(byte*) RASTER#6 ) + to:main::@3 +main::@3: from main::@2 main::@3 + (byte~) main::$1 ← * (byte*) RASTER#1 + if((byte~) main::$1!=(byte) 254) goto main::@3 + to:main::@4 +main::@4: from main::@3 main::@4 + (byte~) main::$3 ← * (byte*) RASTER#1 + if((byte~) main::$3!=(byte) 255) goto main::@4 + to:@2 +@2: from main::@4 + (byte) main::c#1 ← -- (byte) main::c#2 + if((byte) main::c#1!=(byte) 0) goto main::@2 + to:@3 +@3: from @2 + call flip param-assignment + to:@17 +@17: from @3 + call plot param-assignment + to:@18 +@18: from @17 + if(true) goto main::@1 + to:main::@return +main::@return: from @18 + return + to:@RETURN +prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 (byte) prepare::i#2 ← phi( prepare/(byte) 0 prepare::@1/(byte) prepare::i#1 ) @@ -2514,116 +2648,122 @@ prepare::@1: from prepare prepare::@1 prepare::@return: from prepare::@1 return to:@RETURN -flip: from @7 +flip: from @3 to:flip::@1 -flip::@1: from @11 flip - (byte) flip::r#2 ← phi( @11/(byte) flip::r#1 flip/(byte) 16 ) - (byte[256]) buffer1#2 ← phi( @11/(byte[256]) buffer1#2 flip/(byte[256]) buffer1#10 ) - (byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#1 flip/(byte) 0 ) - (byte[256]) buffer2#1 ← phi( @11/(byte[256]) buffer2#1 flip/(byte[256]) buffer2#10 ) - (byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) 15 ) +flip::@1: from @8 flip + (byte) flip::r#2 ← phi( @8/(byte) flip::r#1 flip/(byte) 16 ) + (byte[256]) buffer1#10 ← phi( @8/(byte[256]) buffer1#10 flip/(byte[256]) buffer1#11 ) + (byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#1 flip/(byte) 0 ) + (byte[256]) buffer2#1 ← phi( @8/(byte[256]) buffer2#1 flip/(byte[256]) buffer2#10 ) + (byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) 15 ) to:flip::@2 flip::@2: from flip::@1 flip::@2 (byte) flip::c#2 ← phi( flip::@1/(byte) 16 flip::@2/(byte) flip::c#1 ) (byte) flip::dstIdx#3 ← phi( flip::@1/(byte) flip::dstIdx#5 flip::@2/(byte) flip::dstIdx#1 ) (byte) flip::srcIdx#2 ← phi( flip::@1/(byte) flip::srcIdx#3 flip::@2/(byte) flip::srcIdx#1 ) - (byte~) flip::$0 ← (byte[256]) buffer1#2 *idx (byte) flip::srcIdx#2 + (byte~) flip::$0 ← (byte[256]) buffer1#10 *idx (byte) flip::srcIdx#2 *((byte[256]) buffer2#1 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 (byte) flip::c#1 ← -- (byte) flip::c#2 if((byte) flip::c#1!=(byte) 0) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 (byte) flip::r#1 ← -- (byte) flip::r#2 if((byte) flip::r#1!=(byte) 0) goto flip::@1 to:flip::@3 -flip::@3: from @11 flip::@3 - (byte) flip::i#2 ← phi( @11/(byte) 0 flip::@3/(byte) flip::i#1 ) +flip::@3: from @8 flip::@3 + (byte) flip::i#2 ← phi( @8/(byte) 0 flip::@3/(byte) flip::i#1 ) (byte~) flip::$4 ← (byte[256]) buffer2#1 *idx (byte) flip::i#2 - *((byte[256]) buffer1#2 + (byte) flip::i#2) ← (byte~) flip::$4 + *((byte[256]) buffer1#10 + (byte) flip::i#2) ← (byte~) flip::$4 (byte) flip::i#1 ← ++ (byte) flip::i#2 if((byte) flip::i#1!=(byte) 0) goto flip::@3 to:flip::@return flip::@return: from flip::@3 return to:@RETURN -plot: from @19 +plot: from @17 (byte*) plot::line#0 ← (byte[1000]) SCREEN#1 + (byte) 212 to:plot::@1 -plot::@1: from @15 plot - (byte) plot::y#2 ← phi( @15/(byte) plot::y#1 plot/(byte) 16 ) - (byte[256]) buffer1#11 ← phi( @15/(byte[256]) buffer1#11 plot/(byte[256]) buffer1#10 ) - (byte) plot::i#3 ← phi( @15/(byte) plot::i#1 plot/(byte) 0 ) - (byte*) plot::line#2 ← phi( @15/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) +plot::@1: from @12 plot + (byte) plot::y#2 ← phi( @12/(byte) plot::y#1 plot/(byte) 16 ) + (byte[256]) buffer1#12 ← phi( @12/(byte[256]) buffer1#12 plot/(byte[256]) buffer1#11 ) + (byte) plot::i#3 ← phi( @12/(byte) plot::i#1 plot/(byte) 0 ) + (byte*) plot::line#2 ← phi( @12/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) to:plot::@2 plot::@2: from plot::@1 plot::@2 (byte) plot::x#2 ← phi( plot::@1/(byte) 0 plot::@2/(byte) plot::x#1 ) (byte) plot::i#2 ← phi( plot::@1/(byte) plot::i#3 plot::@2/(byte) plot::i#1 ) - (byte~) plot::$3 ← (byte[256]) buffer1#11 *idx (byte) plot::i#2 + (byte~) plot::$3 ← (byte[256]) buffer1#12 *idx (byte) plot::i#2 *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 (byte) plot::i#1 ← ++ (byte) plot::i#2 (byte) plot::x#1 ← ++ (byte) plot::x#2 if((byte) plot::x#1<(byte) 16) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 (byte) plot::y#1 ← -- (byte) plot::y#2 if((byte) plot::y#1!=(byte) 0) goto plot::@1 to:plot::@return -plot::@return: from @15 +plot::@return: from @12 return to:@RETURN -@END: from @20 +@END: from @BEGIN Self Phi Eliminated (byte[256]) buffer2#10 -Self Phi Eliminated (byte[256]) buffer1#10 +Self Phi Eliminated (byte[256]) buffer1#11 Self Phi Eliminated (byte[1000]) SCREEN#1 Self Phi Eliminated (byte*) RASTER#1 -Self Phi Eliminated (byte[256]) buffer1#2 +Self Phi Eliminated (byte[256]) buffer1#10 Self Phi Eliminated (byte[256]) buffer2#1 -Self Phi Eliminated (byte[256]) buffer1#11 +Self Phi Eliminated (byte[256]) buffer1#12 Succesful SSA optimization Pass2SelfPhiElimination CONTROL FLOW GRAPH @BEGIN: from - call prepare param-assignment - to:@1 -@1: from @20 @BEGIN - (byte[256]) buffer1#20 ← phi( @BEGIN/(word) 4096 @20/(byte[256]) buffer1#10 ) - (byte[256]) buffer2#13 ← phi( @BEGIN/(word) 4352 @20/(byte[256]) buffer2#10 ) - (byte[1000]) SCREEN#9 ← phi( @BEGIN/(word) 1024 @20/(byte[1000]) SCREEN#1 ) - (byte*) RASTER#5 ← phi( @BEGIN/(word) 53266 @20/(byte*) RASTER#1 ) - to:@2 -@2: from @1 @6 - (byte[256]) buffer2#10 ← phi( @1/(byte[256]) buffer2#13 ) - (byte[256]) buffer1#10 ← phi( @1/(byte[256]) buffer1#20 ) - (byte[1000]) SCREEN#1 ← phi( @1/(byte[1000]) SCREEN#9 ) - (byte) c#2 ← phi( @1/(byte) 25 @6/(byte) c#1 ) - (byte*) RASTER#1 ← phi( @1/(byte*) RASTER#5 ) - to:@3 -@3: from @2 @3 - (byte~) $1 ← * (byte*) RASTER#1 - if((byte~) $1!=(byte) 254) goto @3 - to:@4 -@4: from @3 @4 - (byte~) $3 ← * (byte*) RASTER#1 - if((byte~) $3!=(byte) 255) goto @4 - to:@6 -@6: from @4 - (byte) c#1 ← -- (byte) c#2 - if((byte) c#1!=(byte) 0) goto @2 - to:@7 -@7: from @6 - call flip param-assignment - to:@19 -@19: from @7 - call plot param-assignment - to:@20 -@20: from @19 - if(true) goto @1 + call main param-assignment to:@END -prepare: from @BEGIN +main: from @BEGIN + call prepare param-assignment + to:main::@1 +main::@1: from @18 main + (byte[256]) buffer1#21 ← phi( main/(word) 4096 @18/(byte[256]) buffer1#11 ) + (byte[256]) buffer2#13 ← phi( main/(word) 4352 @18/(byte[256]) buffer2#10 ) + (byte[1000]) SCREEN#9 ← phi( main/(word) 1024 @18/(byte[1000]) SCREEN#1 ) + (byte*) RASTER#6 ← phi( main/(word) 53266 @18/(byte*) RASTER#1 ) + to:main::@2 +main::@2: from @2 main::@1 + (byte[256]) buffer2#10 ← phi( main::@1/(byte[256]) buffer2#13 ) + (byte[256]) buffer1#11 ← phi( main::@1/(byte[256]) buffer1#21 ) + (byte[1000]) SCREEN#1 ← phi( main::@1/(byte[1000]) SCREEN#9 ) + (byte) main::c#2 ← phi( @2/(byte) main::c#1 main::@1/(byte) 25 ) + (byte*) RASTER#1 ← phi( main::@1/(byte*) RASTER#6 ) + to:main::@3 +main::@3: from main::@2 main::@3 + (byte~) main::$1 ← * (byte*) RASTER#1 + if((byte~) main::$1!=(byte) 254) goto main::@3 + to:main::@4 +main::@4: from main::@3 main::@4 + (byte~) main::$3 ← * (byte*) RASTER#1 + if((byte~) main::$3!=(byte) 255) goto main::@4 + to:@2 +@2: from main::@4 + (byte) main::c#1 ← -- (byte) main::c#2 + if((byte) main::c#1!=(byte) 0) goto main::@2 + to:@3 +@3: from @2 + call flip param-assignment + to:@17 +@17: from @3 + call plot param-assignment + to:@18 +@18: from @17 + if(true) goto main::@1 + to:main::@return +main::@return: from @18 + return + to:@RETURN +prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 (byte) prepare::i#2 ← phi( prepare/(byte) 0 prepare::@1/(byte) prepare::i#1 ) @@ -2634,111 +2774,117 @@ prepare::@1: from prepare prepare::@1 prepare::@return: from prepare::@1 return to:@RETURN -flip: from @7 +flip: from @3 to:flip::@1 -flip::@1: from @11 flip - (byte) flip::r#2 ← phi( @11/(byte) flip::r#1 flip/(byte) 16 ) - (byte[256]) buffer1#2 ← phi( flip/(byte[256]) buffer1#10 ) - (byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#1 flip/(byte) 0 ) +flip::@1: from @8 flip + (byte) flip::r#2 ← phi( @8/(byte) flip::r#1 flip/(byte) 16 ) + (byte[256]) buffer1#10 ← phi( flip/(byte[256]) buffer1#11 ) + (byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#1 flip/(byte) 0 ) (byte[256]) buffer2#1 ← phi( flip/(byte[256]) buffer2#10 ) - (byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) 15 ) + (byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) 15 ) to:flip::@2 flip::@2: from flip::@1 flip::@2 (byte) flip::c#2 ← phi( flip::@1/(byte) 16 flip::@2/(byte) flip::c#1 ) (byte) flip::dstIdx#3 ← phi( flip::@1/(byte) flip::dstIdx#5 flip::@2/(byte) flip::dstIdx#1 ) (byte) flip::srcIdx#2 ← phi( flip::@1/(byte) flip::srcIdx#3 flip::@2/(byte) flip::srcIdx#1 ) - (byte~) flip::$0 ← (byte[256]) buffer1#2 *idx (byte) flip::srcIdx#2 + (byte~) flip::$0 ← (byte[256]) buffer1#10 *idx (byte) flip::srcIdx#2 *((byte[256]) buffer2#1 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 (byte) flip::c#1 ← -- (byte) flip::c#2 if((byte) flip::c#1!=(byte) 0) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 (byte) flip::r#1 ← -- (byte) flip::r#2 if((byte) flip::r#1!=(byte) 0) goto flip::@1 to:flip::@3 -flip::@3: from @11 flip::@3 - (byte) flip::i#2 ← phi( @11/(byte) 0 flip::@3/(byte) flip::i#1 ) +flip::@3: from @8 flip::@3 + (byte) flip::i#2 ← phi( @8/(byte) 0 flip::@3/(byte) flip::i#1 ) (byte~) flip::$4 ← (byte[256]) buffer2#1 *idx (byte) flip::i#2 - *((byte[256]) buffer1#2 + (byte) flip::i#2) ← (byte~) flip::$4 + *((byte[256]) buffer1#10 + (byte) flip::i#2) ← (byte~) flip::$4 (byte) flip::i#1 ← ++ (byte) flip::i#2 if((byte) flip::i#1!=(byte) 0) goto flip::@3 to:flip::@return flip::@return: from flip::@3 return to:@RETURN -plot: from @19 +plot: from @17 (byte*) plot::line#0 ← (byte[1000]) SCREEN#1 + (byte) 212 to:plot::@1 -plot::@1: from @15 plot - (byte) plot::y#2 ← phi( @15/(byte) plot::y#1 plot/(byte) 16 ) - (byte[256]) buffer1#11 ← phi( plot/(byte[256]) buffer1#10 ) - (byte) plot::i#3 ← phi( @15/(byte) plot::i#1 plot/(byte) 0 ) - (byte*) plot::line#2 ← phi( @15/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) +plot::@1: from @12 plot + (byte) plot::y#2 ← phi( @12/(byte) plot::y#1 plot/(byte) 16 ) + (byte[256]) buffer1#12 ← phi( plot/(byte[256]) buffer1#11 ) + (byte) plot::i#3 ← phi( @12/(byte) plot::i#1 plot/(byte) 0 ) + (byte*) plot::line#2 ← phi( @12/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) to:plot::@2 plot::@2: from plot::@1 plot::@2 (byte) plot::x#2 ← phi( plot::@1/(byte) 0 plot::@2/(byte) plot::x#1 ) (byte) plot::i#2 ← phi( plot::@1/(byte) plot::i#3 plot::@2/(byte) plot::i#1 ) - (byte~) plot::$3 ← (byte[256]) buffer1#11 *idx (byte) plot::i#2 + (byte~) plot::$3 ← (byte[256]) buffer1#12 *idx (byte) plot::i#2 *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 (byte) plot::i#1 ← ++ (byte) plot::i#2 (byte) plot::x#1 ← ++ (byte) plot::x#2 if((byte) plot::x#1<(byte) 16) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 (byte) plot::y#1 ← -- (byte) plot::y#2 if((byte) plot::y#1!=(byte) 0) goto plot::@1 to:plot::@return -plot::@return: from @15 +plot::@return: from @12 return to:@RETURN -@END: from @20 +@END: from @BEGIN Multiple usages for variable. Not optimizing sub-constant (byte) prepare::i#2 Multiple usages for variable. Not optimizing sub-constant (byte[1000]) SCREEN#1 Alias (byte[256]) buffer2#1 = (byte[256]) buffer2#10 (byte[256]) buffer2#13 -Alias (byte[256]) buffer1#10 = (byte[256]) buffer1#20 (byte[256]) buffer1#2 (byte[256]) buffer1#11 +Alias (byte[256]) buffer1#10 = (byte[256]) buffer1#11 (byte[256]) buffer1#21 (byte[256]) buffer1#12 Alias (byte[1000]) SCREEN#1 = (byte[1000]) SCREEN#9 -Alias (byte*) RASTER#1 = (byte*) RASTER#5 +Alias (byte*) RASTER#1 = (byte*) RASTER#6 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH @BEGIN: from - call prepare param-assignment - to:@1 -@1: from @20 @BEGIN - (byte[256]) buffer1#10 ← phi( @BEGIN/(word) 4096 @20/(byte[256]) buffer1#10 ) - (byte[256]) buffer2#1 ← phi( @BEGIN/(word) 4352 @20/(byte[256]) buffer2#1 ) - (byte[1000]) SCREEN#1 ← phi( @BEGIN/(word) 1024 @20/(byte[1000]) SCREEN#1 ) - (byte*) RASTER#1 ← phi( @BEGIN/(word) 53266 @20/(byte*) RASTER#1 ) - to:@2 -@2: from @1 @6 - (byte) c#2 ← phi( @1/(byte) 25 @6/(byte) c#1 ) - to:@3 -@3: from @2 @3 - (byte~) $1 ← * (byte*) RASTER#1 - if((byte~) $1!=(byte) 254) goto @3 - to:@4 -@4: from @3 @4 - (byte~) $3 ← * (byte*) RASTER#1 - if((byte~) $3!=(byte) 255) goto @4 - to:@6 -@6: from @4 - (byte) c#1 ← -- (byte) c#2 - if((byte) c#1!=(byte) 0) goto @2 - to:@7 -@7: from @6 - call flip param-assignment - to:@19 -@19: from @7 - call plot param-assignment - to:@20 -@20: from @19 - if(true) goto @1 + call main param-assignment to:@END -prepare: from @BEGIN +main: from @BEGIN + call prepare param-assignment + to:main::@1 +main::@1: from @18 main + (byte[256]) buffer1#10 ← phi( main/(word) 4096 @18/(byte[256]) buffer1#10 ) + (byte[256]) buffer2#1 ← phi( main/(word) 4352 @18/(byte[256]) buffer2#1 ) + (byte[1000]) SCREEN#1 ← phi( main/(word) 1024 @18/(byte[1000]) SCREEN#1 ) + (byte*) RASTER#1 ← phi( main/(word) 53266 @18/(byte*) RASTER#1 ) + to:main::@2 +main::@2: from @2 main::@1 + (byte) main::c#2 ← phi( @2/(byte) main::c#1 main::@1/(byte) 25 ) + to:main::@3 +main::@3: from main::@2 main::@3 + (byte~) main::$1 ← * (byte*) RASTER#1 + if((byte~) main::$1!=(byte) 254) goto main::@3 + to:main::@4 +main::@4: from main::@3 main::@4 + (byte~) main::$3 ← * (byte*) RASTER#1 + if((byte~) main::$3!=(byte) 255) goto main::@4 + to:@2 +@2: from main::@4 + (byte) main::c#1 ← -- (byte) main::c#2 + if((byte) main::c#1!=(byte) 0) goto main::@2 + to:@3 +@3: from @2 + call flip param-assignment + to:@17 +@17: from @3 + call plot param-assignment + to:@18 +@18: from @17 + if(true) goto main::@1 + to:main::@return +main::@return: from @18 + return + to:@RETURN +prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 (byte) prepare::i#2 ← phi( prepare/(byte) 0 prepare::@1/(byte) prepare::i#1 ) @@ -2749,12 +2895,12 @@ prepare::@1: from prepare prepare::@1 prepare::@return: from prepare::@1 return to:@RETURN -flip: from @7 +flip: from @3 to:flip::@1 -flip::@1: from @11 flip - (byte) flip::r#2 ← phi( @11/(byte) flip::r#1 flip/(byte) 16 ) - (byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#1 flip/(byte) 0 ) - (byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) 15 ) +flip::@1: from @8 flip + (byte) flip::r#2 ← phi( @8/(byte) flip::r#1 flip/(byte) 16 ) + (byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#1 flip/(byte) 0 ) + (byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) 15 ) to:flip::@2 flip::@2: from flip::@1 flip::@2 (byte) flip::c#2 ← phi( flip::@1/(byte) 16 flip::@2/(byte) flip::c#1 ) @@ -2766,14 +2912,14 @@ flip::@2: from flip::@1 flip::@2 (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 (byte) flip::c#1 ← -- (byte) flip::c#2 if((byte) flip::c#1!=(byte) 0) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 (byte) flip::r#1 ← -- (byte) flip::r#2 if((byte) flip::r#1!=(byte) 0) goto flip::@1 to:flip::@3 -flip::@3: from @11 flip::@3 - (byte) flip::i#2 ← phi( @11/(byte) 0 flip::@3/(byte) flip::i#1 ) +flip::@3: from @8 flip::@3 + (byte) flip::i#2 ← phi( @8/(byte) 0 flip::@3/(byte) flip::i#1 ) (byte~) flip::$4 ← (byte[256]) buffer2#1 *idx (byte) flip::i#2 *((byte[256]) buffer1#10 + (byte) flip::i#2) ← (byte~) flip::$4 (byte) flip::i#1 ← ++ (byte) flip::i#2 @@ -2782,13 +2928,13 @@ flip::@3: from @11 flip::@3 flip::@return: from flip::@3 return to:@RETURN -plot: from @19 +plot: from @17 (byte*) plot::line#0 ← (byte[1000]) SCREEN#1 + (byte) 212 to:plot::@1 -plot::@1: from @15 plot - (byte) plot::y#2 ← phi( @15/(byte) plot::y#1 plot/(byte) 16 ) - (byte) plot::i#3 ← phi( @15/(byte) plot::i#1 plot/(byte) 0 ) - (byte*) plot::line#2 ← phi( @15/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) +plot::@1: from @12 plot + (byte) plot::y#2 ← phi( @12/(byte) plot::y#1 plot/(byte) 16 ) + (byte) plot::i#3 ← phi( @12/(byte) plot::i#1 plot/(byte) 0 ) + (byte*) plot::line#2 ← phi( @12/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) to:plot::@2 plot::@2: from plot::@1 plot::@2 (byte) plot::x#2 ← phi( plot::@1/(byte) 0 plot::@2/(byte) plot::x#1 ) @@ -2798,16 +2944,16 @@ plot::@2: from plot::@1 plot::@2 (byte) plot::i#1 ← ++ (byte) plot::i#2 (byte) plot::x#1 ← ++ (byte) plot::x#2 if((byte) plot::x#1<(byte) 16) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 (byte) plot::y#1 ← -- (byte) plot::y#2 if((byte) plot::y#1!=(byte) 0) goto plot::@1 to:plot::@return -plot::@return: from @15 +plot::@return: from @12 return to:@RETURN -@END: from @20 +@END: from @BEGIN Self Phi Eliminated (byte[256]) buffer1#10 Self Phi Eliminated (byte[256]) buffer2#1 @@ -2816,39 +2962,45 @@ Self Phi Eliminated (byte*) RASTER#1 Succesful SSA optimization Pass2SelfPhiElimination CONTROL FLOW GRAPH @BEGIN: from - call prepare param-assignment - to:@1 -@1: from @20 @BEGIN - (byte[256]) buffer1#10 ← phi( @BEGIN/(word) 4096 ) - (byte[256]) buffer2#1 ← phi( @BEGIN/(word) 4352 ) - (byte[1000]) SCREEN#1 ← phi( @BEGIN/(word) 1024 ) - (byte*) RASTER#1 ← phi( @BEGIN/(word) 53266 ) - to:@2 -@2: from @1 @6 - (byte) c#2 ← phi( @1/(byte) 25 @6/(byte) c#1 ) - to:@3 -@3: from @2 @3 - (byte~) $1 ← * (byte*) RASTER#1 - if((byte~) $1!=(byte) 254) goto @3 - to:@4 -@4: from @3 @4 - (byte~) $3 ← * (byte*) RASTER#1 - if((byte~) $3!=(byte) 255) goto @4 - to:@6 -@6: from @4 - (byte) c#1 ← -- (byte) c#2 - if((byte) c#1!=(byte) 0) goto @2 - to:@7 -@7: from @6 - call flip param-assignment - to:@19 -@19: from @7 - call plot param-assignment - to:@20 -@20: from @19 - if(true) goto @1 + call main param-assignment to:@END -prepare: from @BEGIN +main: from @BEGIN + call prepare param-assignment + to:main::@1 +main::@1: from @18 main + (byte[256]) buffer1#10 ← phi( main/(word) 4096 ) + (byte[256]) buffer2#1 ← phi( main/(word) 4352 ) + (byte[1000]) SCREEN#1 ← phi( main/(word) 1024 ) + (byte*) RASTER#1 ← phi( main/(word) 53266 ) + to:main::@2 +main::@2: from @2 main::@1 + (byte) main::c#2 ← phi( @2/(byte) main::c#1 main::@1/(byte) 25 ) + to:main::@3 +main::@3: from main::@2 main::@3 + (byte~) main::$1 ← * (byte*) RASTER#1 + if((byte~) main::$1!=(byte) 254) goto main::@3 + to:main::@4 +main::@4: from main::@3 main::@4 + (byte~) main::$3 ← * (byte*) RASTER#1 + if((byte~) main::$3!=(byte) 255) goto main::@4 + to:@2 +@2: from main::@4 + (byte) main::c#1 ← -- (byte) main::c#2 + if((byte) main::c#1!=(byte) 0) goto main::@2 + to:@3 +@3: from @2 + call flip param-assignment + to:@17 +@17: from @3 + call plot param-assignment + to:@18 +@18: from @17 + if(true) goto main::@1 + to:main::@return +main::@return: from @18 + return + to:@RETURN +prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 (byte) prepare::i#2 ← phi( prepare/(byte) 0 prepare::@1/(byte) prepare::i#1 ) @@ -2859,12 +3011,12 @@ prepare::@1: from prepare prepare::@1 prepare::@return: from prepare::@1 return to:@RETURN -flip: from @7 +flip: from @3 to:flip::@1 -flip::@1: from @11 flip - (byte) flip::r#2 ← phi( @11/(byte) flip::r#1 flip/(byte) 16 ) - (byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#1 flip/(byte) 0 ) - (byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) 15 ) +flip::@1: from @8 flip + (byte) flip::r#2 ← phi( @8/(byte) flip::r#1 flip/(byte) 16 ) + (byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#1 flip/(byte) 0 ) + (byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) 15 ) to:flip::@2 flip::@2: from flip::@1 flip::@2 (byte) flip::c#2 ← phi( flip::@1/(byte) 16 flip::@2/(byte) flip::c#1 ) @@ -2876,14 +3028,14 @@ flip::@2: from flip::@1 flip::@2 (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 (byte) flip::c#1 ← -- (byte) flip::c#2 if((byte) flip::c#1!=(byte) 0) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 (byte) flip::r#1 ← -- (byte) flip::r#2 if((byte) flip::r#1!=(byte) 0) goto flip::@1 to:flip::@3 -flip::@3: from @11 flip::@3 - (byte) flip::i#2 ← phi( @11/(byte) 0 flip::@3/(byte) flip::i#1 ) +flip::@3: from @8 flip::@3 + (byte) flip::i#2 ← phi( @8/(byte) 0 flip::@3/(byte) flip::i#1 ) (byte~) flip::$4 ← (byte[256]) buffer2#1 *idx (byte) flip::i#2 *((byte[256]) buffer1#10 + (byte) flip::i#2) ← (byte~) flip::$4 (byte) flip::i#1 ← ++ (byte) flip::i#2 @@ -2892,13 +3044,13 @@ flip::@3: from @11 flip::@3 flip::@return: from flip::@3 return to:@RETURN -plot: from @19 +plot: from @17 (byte*) plot::line#0 ← (byte[1000]) SCREEN#1 + (byte) 212 to:plot::@1 -plot::@1: from @15 plot - (byte) plot::y#2 ← phi( @15/(byte) plot::y#1 plot/(byte) 16 ) - (byte) plot::i#3 ← phi( @15/(byte) plot::i#1 plot/(byte) 0 ) - (byte*) plot::line#2 ← phi( @15/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) +plot::@1: from @12 plot + (byte) plot::y#2 ← phi( @12/(byte) plot::y#1 plot/(byte) 16 ) + (byte) plot::i#3 ← phi( @12/(byte) plot::i#1 plot/(byte) 0 ) + (byte*) plot::line#2 ← phi( @12/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) to:plot::@2 plot::@2: from plot::@1 plot::@2 (byte) plot::x#2 ← phi( plot::@1/(byte) 0 plot::@2/(byte) plot::x#1 ) @@ -2908,16 +3060,16 @@ plot::@2: from plot::@1 plot::@2 (byte) plot::i#1 ← ++ (byte) plot::i#2 (byte) plot::x#1 ← ++ (byte) plot::x#2 if((byte) plot::x#1<(byte) 16) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 (byte) plot::y#1 ← -- (byte) plot::y#2 if((byte) plot::y#1!=(byte) 0) goto plot::@1 to:plot::@return -plot::@return: from @15 +plot::@return: from @12 return to:@RETURN -@END: from @20 +@END: from @BEGIN Constant (byte[256]) buffer1#10 (word) 4096 Constant (byte[256]) buffer2#1 (word) 4352 @@ -2926,35 +3078,41 @@ Constant (byte*) RASTER#1 (word) 53266 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH @BEGIN: from - call prepare param-assignment - to:@1 -@1: from @20 @BEGIN - to:@2 -@2: from @1 @6 - (byte) c#2 ← phi( @1/(byte) 25 @6/(byte) c#1 ) - to:@3 -@3: from @2 @3 - (byte~) $1 ← * (word) 53266 - if((byte~) $1!=(byte) 254) goto @3 - to:@4 -@4: from @3 @4 - (byte~) $3 ← * (word) 53266 - if((byte~) $3!=(byte) 255) goto @4 - to:@6 -@6: from @4 - (byte) c#1 ← -- (byte) c#2 - if((byte) c#1!=(byte) 0) goto @2 - to:@7 -@7: from @6 - call flip param-assignment - to:@19 -@19: from @7 - call plot param-assignment - to:@20 -@20: from @19 - if(true) goto @1 + call main param-assignment to:@END -prepare: from @BEGIN +main: from @BEGIN + call prepare param-assignment + to:main::@1 +main::@1: from @18 main + to:main::@2 +main::@2: from @2 main::@1 + (byte) main::c#2 ← phi( @2/(byte) main::c#1 main::@1/(byte) 25 ) + to:main::@3 +main::@3: from main::@2 main::@3 + (byte~) main::$1 ← * (word) 53266 + if((byte~) main::$1!=(byte) 254) goto main::@3 + to:main::@4 +main::@4: from main::@3 main::@4 + (byte~) main::$3 ← * (word) 53266 + if((byte~) main::$3!=(byte) 255) goto main::@4 + to:@2 +@2: from main::@4 + (byte) main::c#1 ← -- (byte) main::c#2 + if((byte) main::c#1!=(byte) 0) goto main::@2 + to:@3 +@3: from @2 + call flip param-assignment + to:@17 +@17: from @3 + call plot param-assignment + to:@18 +@18: from @17 + if(true) goto main::@1 + to:main::@return +main::@return: from @18 + return + to:@RETURN +prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 (byte) prepare::i#2 ← phi( prepare/(byte) 0 prepare::@1/(byte) prepare::i#1 ) @@ -2965,12 +3123,12 @@ prepare::@1: from prepare prepare::@1 prepare::@return: from prepare::@1 return to:@RETURN -flip: from @7 +flip: from @3 to:flip::@1 -flip::@1: from @11 flip - (byte) flip::r#2 ← phi( @11/(byte) flip::r#1 flip/(byte) 16 ) - (byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#1 flip/(byte) 0 ) - (byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) 15 ) +flip::@1: from @8 flip + (byte) flip::r#2 ← phi( @8/(byte) flip::r#1 flip/(byte) 16 ) + (byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#1 flip/(byte) 0 ) + (byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) 15 ) to:flip::@2 flip::@2: from flip::@1 flip::@2 (byte) flip::c#2 ← phi( flip::@1/(byte) 16 flip::@2/(byte) flip::c#1 ) @@ -2982,14 +3140,14 @@ flip::@2: from flip::@1 flip::@2 (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 (byte) flip::c#1 ← -- (byte) flip::c#2 if((byte) flip::c#1!=(byte) 0) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 (byte) flip::r#1 ← -- (byte) flip::r#2 if((byte) flip::r#1!=(byte) 0) goto flip::@1 to:flip::@3 -flip::@3: from @11 flip::@3 - (byte) flip::i#2 ← phi( @11/(byte) 0 flip::@3/(byte) flip::i#1 ) +flip::@3: from @8 flip::@3 + (byte) flip::i#2 ← phi( @8/(byte) 0 flip::@3/(byte) flip::i#1 ) (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 *((word) 4096 + (byte) flip::i#2) ← (byte~) flip::$4 (byte) flip::i#1 ← ++ (byte) flip::i#2 @@ -2998,13 +3156,13 @@ flip::@3: from @11 flip::@3 flip::@return: from flip::@3 return to:@RETURN -plot: from @19 +plot: from @17 (byte*) plot::line#0 ← (word) 1024 + (byte) 212 to:plot::@1 -plot::@1: from @15 plot - (byte) plot::y#2 ← phi( @15/(byte) plot::y#1 plot/(byte) 16 ) - (byte) plot::i#3 ← phi( @15/(byte) plot::i#1 plot/(byte) 0 ) - (byte*) plot::line#2 ← phi( @15/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) +plot::@1: from @12 plot + (byte) plot::y#2 ← phi( @12/(byte) plot::y#1 plot/(byte) 16 ) + (byte) plot::i#3 ← phi( @12/(byte) plot::i#1 plot/(byte) 0 ) + (byte*) plot::line#2 ← phi( @12/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) to:plot::@2 plot::@2: from plot::@1 plot::@2 (byte) plot::x#2 ← phi( plot::@1/(byte) 0 plot::@2/(byte) plot::x#1 ) @@ -3014,53 +3172,59 @@ plot::@2: from plot::@1 plot::@2 (byte) plot::i#1 ← ++ (byte) plot::i#2 (byte) plot::x#1 ← ++ (byte) plot::x#2 if((byte) plot::x#1<(byte) 16) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 (byte) plot::y#1 ← -- (byte) plot::y#2 if((byte) plot::y#1!=(byte) 0) goto plot::@1 to:plot::@return -plot::@return: from @15 +plot::@return: from @12 return to:@RETURN -@END: from @20 +@END: from @BEGIN Multiple usages for variable. Not optimizing sub-constant (byte) prepare::i#2 Multiple usages for variable. Not optimizing sub-constant (byte) flip::srcIdx#2 Multiple usages for variable. Not optimizing sub-constant (byte) flip::i#2 Multiple usages for variable. Not optimizing sub-constant (byte) flip::i#2 Multiple usages for variable. Not optimizing sub-constant (byte) plot::i#2 -Culled Empty Block (label) @1 +Culled Empty Block (label) main::@1 Succesful SSA optimization Pass2CullEmptyBlocks CONTROL FLOW GRAPH @BEGIN: from - call prepare param-assignment - to:@2 -@2: from @20 @6 @BEGIN - (byte) c#2 ← phi( @20/(byte) 25 @6/(byte) c#1 @BEGIN/(byte) 25 ) - to:@3 -@3: from @2 @3 - (byte~) $1 ← * (word) 53266 - if((byte~) $1!=(byte) 254) goto @3 - to:@4 -@4: from @3 @4 - (byte~) $3 ← * (word) 53266 - if((byte~) $3!=(byte) 255) goto @4 - to:@6 -@6: from @4 - (byte) c#1 ← -- (byte) c#2 - if((byte) c#1!=(byte) 0) goto @2 - to:@7 -@7: from @6 - call flip param-assignment - to:@19 -@19: from @7 - call plot param-assignment - to:@20 -@20: from @19 - if(true) goto @2 + call main param-assignment to:@END -prepare: from @BEGIN +main: from @BEGIN + call prepare param-assignment + to:main::@2 +main::@2: from @18 @2 main + (byte) main::c#2 ← phi( @2/(byte) main::c#1 @18/(byte) 25 main/(byte) 25 ) + to:main::@3 +main::@3: from main::@2 main::@3 + (byte~) main::$1 ← * (word) 53266 + if((byte~) main::$1!=(byte) 254) goto main::@3 + to:main::@4 +main::@4: from main::@3 main::@4 + (byte~) main::$3 ← * (word) 53266 + if((byte~) main::$3!=(byte) 255) goto main::@4 + to:@2 +@2: from main::@4 + (byte) main::c#1 ← -- (byte) main::c#2 + if((byte) main::c#1!=(byte) 0) goto main::@2 + to:@3 +@3: from @2 + call flip param-assignment + to:@17 +@17: from @3 + call plot param-assignment + to:@18 +@18: from @17 + if(true) goto main::@2 + to:main::@return +main::@return: from @18 + return + to:@RETURN +prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 (byte) prepare::i#2 ← phi( prepare/(byte) 0 prepare::@1/(byte) prepare::i#1 ) @@ -3071,12 +3235,12 @@ prepare::@1: from prepare prepare::@1 prepare::@return: from prepare::@1 return to:@RETURN -flip: from @7 +flip: from @3 to:flip::@1 -flip::@1: from @11 flip - (byte) flip::r#2 ← phi( @11/(byte) flip::r#1 flip/(byte) 16 ) - (byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#1 flip/(byte) 0 ) - (byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) 15 ) +flip::@1: from @8 flip + (byte) flip::r#2 ← phi( @8/(byte) flip::r#1 flip/(byte) 16 ) + (byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#1 flip/(byte) 0 ) + (byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) 15 ) to:flip::@2 flip::@2: from flip::@1 flip::@2 (byte) flip::c#2 ← phi( flip::@1/(byte) 16 flip::@2/(byte) flip::c#1 ) @@ -3088,14 +3252,14 @@ flip::@2: from flip::@1 flip::@2 (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 (byte) flip::c#1 ← -- (byte) flip::c#2 if((byte) flip::c#1!=(byte) 0) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 (byte) flip::r#1 ← -- (byte) flip::r#2 if((byte) flip::r#1!=(byte) 0) goto flip::@1 to:flip::@3 -flip::@3: from @11 flip::@3 - (byte) flip::i#2 ← phi( @11/(byte) 0 flip::@3/(byte) flip::i#1 ) +flip::@3: from @8 flip::@3 + (byte) flip::i#2 ← phi( @8/(byte) 0 flip::@3/(byte) flip::i#1 ) (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 *((word) 4096 + (byte) flip::i#2) ← (byte~) flip::$4 (byte) flip::i#1 ← ++ (byte) flip::i#2 @@ -3104,13 +3268,13 @@ flip::@3: from @11 flip::@3 flip::@return: from flip::@3 return to:@RETURN -plot: from @19 +plot: from @17 (byte*) plot::line#0 ← (word) 1024 + (byte) 212 to:plot::@1 -plot::@1: from @15 plot - (byte) plot::y#2 ← phi( @15/(byte) plot::y#1 plot/(byte) 16 ) - (byte) plot::i#3 ← phi( @15/(byte) plot::i#1 plot/(byte) 0 ) - (byte*) plot::line#2 ← phi( @15/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) +plot::@1: from @12 plot + (byte) plot::y#2 ← phi( @12/(byte) plot::y#1 plot/(byte) 16 ) + (byte) plot::i#3 ← phi( @12/(byte) plot::i#1 plot/(byte) 0 ) + (byte*) plot::line#2 ← phi( @12/(byte*) plot::line#1 plot/(byte*) plot::line#0 ) to:plot::@2 plot::@2: from plot::@1 plot::@2 (byte) plot::x#2 ← phi( plot::@1/(byte) 0 plot::@2/(byte) plot::x#1 ) @@ -3120,48 +3284,54 @@ plot::@2: from plot::@1 plot::@2 (byte) plot::i#1 ← ++ (byte) plot::i#2 (byte) plot::x#1 ← ++ (byte) plot::x#2 if((byte) plot::x#1<(byte) 16) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 (byte) plot::y#1 ← -- (byte) plot::y#2 if((byte) plot::y#1!=(byte) 0) goto plot::@1 to:plot::@return -plot::@return: from @15 +plot::@return: from @12 return to:@RETURN -@END: from @20 +@END: from @BEGIN Constant (byte*) plot::line#0 (word) 1236 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH @BEGIN: from - call prepare param-assignment - to:@2 -@2: from @20 @6 @BEGIN - (byte) c#2 ← phi( @20/(byte) 25 @6/(byte) c#1 @BEGIN/(byte) 25 ) - to:@3 -@3: from @2 @3 - (byte~) $1 ← * (word) 53266 - if((byte~) $1!=(byte) 254) goto @3 - to:@4 -@4: from @3 @4 - (byte~) $3 ← * (word) 53266 - if((byte~) $3!=(byte) 255) goto @4 - to:@6 -@6: from @4 - (byte) c#1 ← -- (byte) c#2 - if((byte) c#1!=(byte) 0) goto @2 - to:@7 -@7: from @6 - call flip param-assignment - to:@19 -@19: from @7 - call plot param-assignment - to:@20 -@20: from @19 - if(true) goto @2 + call main param-assignment to:@END -prepare: from @BEGIN +main: from @BEGIN + call prepare param-assignment + to:main::@2 +main::@2: from @18 @2 main + (byte) main::c#2 ← phi( @2/(byte) main::c#1 @18/(byte) 25 main/(byte) 25 ) + to:main::@3 +main::@3: from main::@2 main::@3 + (byte~) main::$1 ← * (word) 53266 + if((byte~) main::$1!=(byte) 254) goto main::@3 + to:main::@4 +main::@4: from main::@3 main::@4 + (byte~) main::$3 ← * (word) 53266 + if((byte~) main::$3!=(byte) 255) goto main::@4 + to:@2 +@2: from main::@4 + (byte) main::c#1 ← -- (byte) main::c#2 + if((byte) main::c#1!=(byte) 0) goto main::@2 + to:@3 +@3: from @2 + call flip param-assignment + to:@17 +@17: from @3 + call plot param-assignment + to:@18 +@18: from @17 + if(true) goto main::@2 + to:main::@return +main::@return: from @18 + return + to:@RETURN +prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 (byte) prepare::i#2 ← phi( prepare/(byte) 0 prepare::@1/(byte) prepare::i#1 ) @@ -3172,12 +3342,12 @@ prepare::@1: from prepare prepare::@1 prepare::@return: from prepare::@1 return to:@RETURN -flip: from @7 +flip: from @3 to:flip::@1 -flip::@1: from @11 flip - (byte) flip::r#2 ← phi( @11/(byte) flip::r#1 flip/(byte) 16 ) - (byte) flip::srcIdx#3 ← phi( @11/(byte) flip::srcIdx#1 flip/(byte) 0 ) - (byte) flip::dstIdx#5 ← phi( @11/(byte) flip::dstIdx#2 flip/(byte) 15 ) +flip::@1: from @8 flip + (byte) flip::r#2 ← phi( @8/(byte) flip::r#1 flip/(byte) 16 ) + (byte) flip::srcIdx#3 ← phi( @8/(byte) flip::srcIdx#1 flip/(byte) 0 ) + (byte) flip::dstIdx#5 ← phi( @8/(byte) flip::dstIdx#2 flip/(byte) 15 ) to:flip::@2 flip::@2: from flip::@1 flip::@2 (byte) flip::c#2 ← phi( flip::@1/(byte) 16 flip::@2/(byte) flip::c#1 ) @@ -3189,14 +3359,14 @@ flip::@2: from flip::@1 flip::@2 (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 (byte) flip::c#1 ← -- (byte) flip::c#2 if((byte) flip::c#1!=(byte) 0) goto flip::@2 - to:@11 -@11: from flip::@2 + to:@8 +@8: from flip::@2 (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 (byte) flip::r#1 ← -- (byte) flip::r#2 if((byte) flip::r#1!=(byte) 0) goto flip::@1 to:flip::@3 -flip::@3: from @11 flip::@3 - (byte) flip::i#2 ← phi( @11/(byte) 0 flip::@3/(byte) flip::i#1 ) +flip::@3: from @8 flip::@3 + (byte) flip::i#2 ← phi( @8/(byte) 0 flip::@3/(byte) flip::i#1 ) (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 *((word) 4096 + (byte) flip::i#2) ← (byte~) flip::$4 (byte) flip::i#1 ← ++ (byte) flip::i#2 @@ -3205,12 +3375,12 @@ flip::@3: from @11 flip::@3 flip::@return: from flip::@3 return to:@RETURN -plot: from @19 +plot: from @17 to:plot::@1 -plot::@1: from @15 plot - (byte) plot::y#2 ← phi( @15/(byte) plot::y#1 plot/(byte) 16 ) - (byte) plot::i#3 ← phi( @15/(byte) plot::i#1 plot/(byte) 0 ) - (byte*) plot::line#2 ← phi( @15/(byte*) plot::line#1 plot/(word) 1236 ) +plot::@1: from @12 plot + (byte) plot::y#2 ← phi( @12/(byte) plot::y#1 plot/(byte) 16 ) + (byte) plot::i#3 ← phi( @12/(byte) plot::i#1 plot/(byte) 0 ) + (byte*) plot::line#2 ← phi( @12/(byte*) plot::line#1 plot/(word) 1236 ) to:plot::@2 plot::@2: from plot::@1 plot::@2 (byte) plot::x#2 ← phi( plot::@1/(byte) 0 plot::@2/(byte) plot::x#1 ) @@ -3220,16 +3390,16 @@ plot::@2: from plot::@1 plot::@2 (byte) plot::i#1 ← ++ (byte) plot::i#2 (byte) plot::x#1 ← ++ (byte) plot::x#2 if((byte) plot::x#1<(byte) 16) goto plot::@2 - to:@15 -@15: from plot::@2 + to:@12 +@12: from plot::@2 (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 (byte) plot::y#1 ← -- (byte) plot::y#2 if((byte) plot::y#1!=(byte) 0) goto plot::@1 to:plot::@return -plot::@return: from @15 +plot::@return: from @12 return to:@RETURN -@END: from @20 +@END: from @BEGIN Multiple usages for variable. Not optimizing sub-constant (byte) prepare::i#2 Multiple usages for variable. Not optimizing sub-constant (byte) flip::srcIdx#2 @@ -3243,52 +3413,57 @@ Multiple usages for variable. Not optimizing sub-constant (byte) flip::i#2 Multiple usages for variable. Not optimizing sub-constant (byte) plot::i#2 INITIAL ASM BBEGIN: - jsr prepare -B2_from_BBEGIN: - // (byte) c#2 = (byte) 25 // xby=coby1 - ldx #25 - jmp B2 -B2_from_B20: - // (byte) c#2 = (byte) 25 // xby=coby1 - ldx #25 - jmp B2 -B2_from_B6: - // (byte) c#2 = (byte) c#1 // register copy - jmp B2 -B2: - jmp B3 -B3: - // (byte~) $1 ← * (word) 53266 // aby=_star_cowo1 - lda 53266 - // if((byte~) $1!=(byte) 254) goto @3 // aby_neq_coby1_then_la1 - cmp #254 - bne B3 - jmp B4 -B4: - // (byte~) $3 ← * (word) 53266 // aby=_star_cowo1 - lda 53266 - // if((byte~) $3!=(byte) 255) goto @4 // aby_neq_coby1_then_la1 - cmp #255 - bne B4 - jmp B6 -B6: - // (byte) c#1 ← -- (byte) c#2 // xby=_dec_xby - dex - // if((byte) c#1!=(byte) 0) goto @2 // xby_neq_0_then_la1 - cpx #0 - bne B2_from_B6 - jmp B7 -B7: - jsr flip - jmp B19 -B19: - jsr plot - jmp B20 -B20: - // if(true) goto @2 // true_then_la1 - jmp B2_from_B20 + jsr main jmp BEND BEND: +main: + jsr prepare +main__B2_from_main: + // (byte) main::c#2 = (byte) 25 // xby=coby1 + ldx #25 + jmp main__B2 +main__B2_from_B18: + // (byte) main::c#2 = (byte) 25 // xby=coby1 + ldx #25 + jmp main__B2 +main__B2_from_B2: + // (byte) main::c#2 = (byte) main::c#1 // register copy + jmp main__B2 +main__B2: + jmp main__B3 +main__B3: + // (byte~) main::$1 ← * (word) 53266 // aby=_star_cowo1 + lda 53266 + // if((byte~) main::$1!=(byte) 254) goto main::@3 // aby_neq_coby1_then_la1 + cmp #254 + bne main__main__B3 + jmp main__B4 +main__B4: + // (byte~) main::$3 ← * (word) 53266 // aby=_star_cowo1 + lda 53266 + // if((byte~) main::$3!=(byte) 255) goto main::@4 // aby_neq_coby1_then_la1 + cmp #255 + bne main__main__B4 + jmp B2 +B2: + // (byte) main::c#1 ← -- (byte) main::c#2 // xby=_dec_xby + dex + // if((byte) main::c#1!=(byte) 0) goto main::@2 // xby_neq_0_then_la1 + cpx #0 + bne main__B2_from_B2 + jmp B3 +B3: + jsr flip + jmp B17 +B17: + jsr plot + jmp B18 +B18: + // if(true) goto main::@2 // true_then_la1 + jmp main__B2_from_B18 + jmp main__Breturn +main__Breturn: + rts plot: plot__B1_from_plot: // (byte) plot::y#2 = (byte) 16 // zpby1=coby1 @@ -3302,7 +3477,7 @@ plot__B1_from_plot: lda #>1236 sta 101+1 jmp plot__B1 -plot__B1_from_B15: +plot__B1_from_B12: // (byte) plot::y#2 = (byte) plot::y#1 // register copy // (byte) plot::i#3 = (byte) plot::i#1 // register copy // (byte*) plot::line#2 = (byte*) plot::line#1 // register copy @@ -3329,8 +3504,8 @@ plot__B2: // if((byte) plot::x#1<(byte) 16) goto plot::@2 // yby_lt_coby1_then_la1 cpy #16 bcc plot__B2_from_B2 - jmp B15 -B15: + jmp B12 +B12: // (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 // zpptrby1=zpptrby1_plus_coby1 lda 101 clc @@ -3343,7 +3518,7 @@ B15: dec 100 // if((byte) plot::y#1!=(byte) 0) goto plot::@1 // zpby1_neq_0_then_la1 lda 100 - bne plot__B1_from_B15 + bne plot__B1_from_B12 jmp plot__Breturn plot__Breturn: rts @@ -3357,7 +3532,7 @@ flip__B1_from_flip: // (byte) flip::dstIdx#5 = (byte) 15 // yby=coby1 ldy #15 jmp flip__B1 -flip__B1_from_B11: +flip__B1_from_B8: // (byte) flip::r#2 = (byte) flip::r#1 // register copy // (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 // register copy // (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 // register copy @@ -3392,16 +3567,16 @@ flip__B2: // if((byte) flip::c#1!=(byte) 0) goto flip::@2 // zpby1_neq_0_then_la1 lda 103 bne flip__B2_from_B2 - jmp B11 -B11: + jmp B8 +B8: // (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 // yby=_dec_yby dey // (byte) flip::r#1 ← -- (byte) flip::r#2 // zpby1=_dec_zpby1 dec 104 // if((byte) flip::r#1!=(byte) 0) goto flip::@1 // zpby1_neq_0_then_la1 lda 104 - bne flip__B1_from_B11 -flip__B3_from_B11: + bne flip__B1_from_B8 +flip__B3_from_B8: // (byte) flip::i#2 = (byte) 0 // xby=coby1 ldx #0 jmp flip__B3 @@ -3442,21 +3617,22 @@ prepare__B1: prepare__Breturn: rts +Removing instruction jmp BEND +Removing instruction jmp main__B2 +Removing instruction jmp main__B3 +Removing instruction jmp main__B4 Removing instruction jmp B2 Removing instruction jmp B3 -Removing instruction jmp B4 -Removing instruction jmp B6 -Removing instruction jmp B7 -Removing instruction jmp B19 -Removing instruction jmp B20 -Removing instruction jmp BEND +Removing instruction jmp B17 +Removing instruction jmp B18 +Removing instruction jmp main__Breturn Removing instruction jmp plot__B1 Removing instruction jmp plot__B2 -Removing instruction jmp B15 +Removing instruction jmp B12 Removing instruction jmp plot__Breturn Removing instruction jmp flip__B1 Removing instruction jmp flip__B2 -Removing instruction jmp B11 +Removing instruction jmp B8 Removing instruction jmp flip__B3 Removing instruction jmp flip__Breturn Removing instruction jmp prepare__B1 @@ -3464,44 +3640,48 @@ Removing instruction jmp prepare__Breturn Succesful ASM optimization Pass4NextJumpElimination ASSEMBLER BBEGIN: - jsr prepare -B2_from_BBEGIN: - // (byte) c#2 = (byte) 25 // xby=coby1 - ldx #25 - jmp B2 -B2_from_B20: - // (byte) c#2 = (byte) 25 // xby=coby1 - ldx #25 - jmp B2 -B2_from_B6: - // (byte) c#2 = (byte) c#1 // register copy -B2: -B3: - // (byte~) $1 ← * (word) 53266 // aby=_star_cowo1 - lda 53266 - // if((byte~) $1!=(byte) 254) goto @3 // aby_neq_coby1_then_la1 - cmp #254 - bne B3 -B4: - // (byte~) $3 ← * (word) 53266 // aby=_star_cowo1 - lda 53266 - // if((byte~) $3!=(byte) 255) goto @4 // aby_neq_coby1_then_la1 - cmp #255 - bne B4 -B6: - // (byte) c#1 ← -- (byte) c#2 // xby=_dec_xby - dex - // if((byte) c#1!=(byte) 0) goto @2 // xby_neq_0_then_la1 - cpx #0 - bne B2_from_B6 -B7: - jsr flip -B19: - jsr plot -B20: - // if(true) goto @2 // true_then_la1 - jmp B2_from_B20 + jsr main BEND: +main: + jsr prepare +main__B2_from_main: + // (byte) main::c#2 = (byte) 25 // xby=coby1 + ldx #25 + jmp main__B2 +main__B2_from_B18: + // (byte) main::c#2 = (byte) 25 // xby=coby1 + ldx #25 + jmp main__B2 +main__B2_from_B2: + // (byte) main::c#2 = (byte) main::c#1 // register copy +main__B2: +main__B3: + // (byte~) main::$1 ← * (word) 53266 // aby=_star_cowo1 + lda 53266 + // if((byte~) main::$1!=(byte) 254) goto main::@3 // aby_neq_coby1_then_la1 + cmp #254 + bne main__main__B3 +main__B4: + // (byte~) main::$3 ← * (word) 53266 // aby=_star_cowo1 + lda 53266 + // if((byte~) main::$3!=(byte) 255) goto main::@4 // aby_neq_coby1_then_la1 + cmp #255 + bne main__main__B4 +B2: + // (byte) main::c#1 ← -- (byte) main::c#2 // xby=_dec_xby + dex + // if((byte) main::c#1!=(byte) 0) goto main::@2 // xby_neq_0_then_la1 + cpx #0 + bne main__B2_from_B2 +B3: + jsr flip +B17: + jsr plot +B18: + // if(true) goto main::@2 // true_then_la1 + jmp main__B2_from_B18 +main__Breturn: + rts plot: plot__B1_from_plot: // (byte) plot::y#2 = (byte) 16 // zpby1=coby1 @@ -3515,7 +3695,7 @@ plot__B1_from_plot: lda #>1236 sta 101+1 jmp plot__B1 -plot__B1_from_B15: +plot__B1_from_B12: // (byte) plot::y#2 = (byte) plot::y#1 // register copy // (byte) plot::i#3 = (byte) plot::i#1 // register copy // (byte*) plot::line#2 = (byte*) plot::line#1 // register copy @@ -3540,7 +3720,7 @@ plot__B2: // if((byte) plot::x#1<(byte) 16) goto plot::@2 // yby_lt_coby1_then_la1 cpy #16 bcc plot__B2_from_B2 -B15: +B12: // (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 // zpptrby1=zpptrby1_plus_coby1 lda 101 clc @@ -3553,7 +3733,7 @@ B15: dec 100 // if((byte) plot::y#1!=(byte) 0) goto plot::@1 // zpby1_neq_0_then_la1 lda 100 - bne plot__B1_from_B15 + bne plot__B1_from_B12 plot__Breturn: rts flip: @@ -3566,7 +3746,7 @@ flip__B1_from_flip: // (byte) flip::dstIdx#5 = (byte) 15 // yby=coby1 ldy #15 jmp flip__B1 -flip__B1_from_B11: +flip__B1_from_B8: // (byte) flip::r#2 = (byte) flip::r#1 // register copy // (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 // register copy // (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 // register copy @@ -3599,15 +3779,15 @@ flip__B2: // if((byte) flip::c#1!=(byte) 0) goto flip::@2 // zpby1_neq_0_then_la1 lda 103 bne flip__B2_from_B2 -B11: +B8: // (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 // yby=_dec_yby dey // (byte) flip::r#1 ← -- (byte) flip::r#2 // zpby1=_dec_zpby1 dec 104 // if((byte) flip::r#1!=(byte) 0) goto flip::@1 // zpby1_neq_0_then_la1 lda 104 - bne flip__B1_from_B11 -flip__B3_from_B11: + bne flip__B1_from_B8 +flip__B3_from_B8: // (byte) flip::i#2 = (byte) 0 // xby=coby1 ldx #0 jmp flip__B3 @@ -3644,7 +3824,7 @@ prepare__B1: prepare__Breturn: rts -Removing instruction jmp B2 +Removing instruction jmp main__B2 Removing instruction jmp plot__B1 Removing instruction jmp plot__B2 Removing instruction jmp flip__B1 @@ -3654,43 +3834,47 @@ Removing instruction jmp prepare__B1 Succesful ASM optimization Pass4NextJumpElimination ASSEMBLER BBEGIN: - jsr prepare -B2_from_BBEGIN: - // (byte) c#2 = (byte) 25 // xby=coby1 - ldx #25 - jmp B2 -B2_from_B20: - // (byte) c#2 = (byte) 25 // xby=coby1 - ldx #25 -B2_from_B6: - // (byte) c#2 = (byte) c#1 // register copy -B2: -B3: - // (byte~) $1 ← * (word) 53266 // aby=_star_cowo1 - lda 53266 - // if((byte~) $1!=(byte) 254) goto @3 // aby_neq_coby1_then_la1 - cmp #254 - bne B3 -B4: - // (byte~) $3 ← * (word) 53266 // aby=_star_cowo1 - lda 53266 - // if((byte~) $3!=(byte) 255) goto @4 // aby_neq_coby1_then_la1 - cmp #255 - bne B4 -B6: - // (byte) c#1 ← -- (byte) c#2 // xby=_dec_xby - dex - // if((byte) c#1!=(byte) 0) goto @2 // xby_neq_0_then_la1 - cpx #0 - bne B2_from_B6 -B7: - jsr flip -B19: - jsr plot -B20: - // if(true) goto @2 // true_then_la1 - jmp B2_from_B20 + jsr main BEND: +main: + jsr prepare +main__B2_from_main: + // (byte) main::c#2 = (byte) 25 // xby=coby1 + ldx #25 + jmp main__B2 +main__B2_from_B18: + // (byte) main::c#2 = (byte) 25 // xby=coby1 + ldx #25 +main__B2_from_B2: + // (byte) main::c#2 = (byte) main::c#1 // register copy +main__B2: +main__B3: + // (byte~) main::$1 ← * (word) 53266 // aby=_star_cowo1 + lda 53266 + // if((byte~) main::$1!=(byte) 254) goto main::@3 // aby_neq_coby1_then_la1 + cmp #254 + bne main__main__B3 +main__B4: + // (byte~) main::$3 ← * (word) 53266 // aby=_star_cowo1 + lda 53266 + // if((byte~) main::$3!=(byte) 255) goto main::@4 // aby_neq_coby1_then_la1 + cmp #255 + bne main__main__B4 +B2: + // (byte) main::c#1 ← -- (byte) main::c#2 // xby=_dec_xby + dex + // if((byte) main::c#1!=(byte) 0) goto main::@2 // xby_neq_0_then_la1 + cpx #0 + bne main__B2_from_B2 +B3: + jsr flip +B17: + jsr plot +B18: + // if(true) goto main::@2 // true_then_la1 + jmp main__B2_from_B18 +main__Breturn: + rts plot: plot__B1_from_plot: // (byte) plot::y#2 = (byte) 16 // zpby1=coby1 @@ -3703,7 +3887,7 @@ plot__B1_from_plot: sta 101 lda #>1236 sta 101+1 -plot__B1_from_B15: +plot__B1_from_B12: // (byte) plot::y#2 = (byte) plot::y#1 // register copy // (byte) plot::i#3 = (byte) plot::i#1 // register copy // (byte*) plot::line#2 = (byte*) plot::line#1 // register copy @@ -3727,7 +3911,7 @@ plot__B2: // if((byte) plot::x#1<(byte) 16) goto plot::@2 // yby_lt_coby1_then_la1 cpy #16 bcc plot__B2_from_B2 -B15: +B12: // (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 // zpptrby1=zpptrby1_plus_coby1 lda 101 clc @@ -3740,7 +3924,7 @@ B15: dec 100 // if((byte) plot::y#1!=(byte) 0) goto plot::@1 // zpby1_neq_0_then_la1 lda 100 - bne plot__B1_from_B15 + bne plot__B1_from_B12 plot__Breturn: rts flip: @@ -3752,7 +3936,7 @@ flip__B1_from_flip: ldx #0 // (byte) flip::dstIdx#5 = (byte) 15 // yby=coby1 ldy #15 -flip__B1_from_B11: +flip__B1_from_B8: // (byte) flip::r#2 = (byte) flip::r#1 // register copy // (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 // register copy // (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 // register copy @@ -3784,15 +3968,271 @@ flip__B2: // if((byte) flip::c#1!=(byte) 0) goto flip::@2 // zpby1_neq_0_then_la1 lda 103 bne flip__B2_from_B2 -B11: +B8: // (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 // yby=_dec_yby dey // (byte) flip::r#1 ← -- (byte) flip::r#2 // zpby1=_dec_zpby1 dec 104 // if((byte) flip::r#1!=(byte) 0) goto flip::@1 // zpby1_neq_0_then_la1 lda 104 - bne flip__B1_from_B11 -flip__B3_from_B11: + bne flip__B1_from_B8 +flip__B3_from_B8: + // (byte) flip::i#2 = (byte) 0 // xby=coby1 + ldx #0 +flip__B3_from_B3: + // (byte) flip::i#2 = (byte) flip::i#1 // register copy +flip__B3: + // (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 // aby=cowo1_staridx_xby + lda 4352,x + // *((word) 4096 + (byte) flip::i#2) ← (byte~) flip::$4 // ptr_cowo1_xby=aby + sta 4096,x + // (byte) flip::i#1 ← ++ (byte) flip::i#2 // xby=_inc_xby + inx + // if((byte) flip::i#1!=(byte) 0) goto flip::@3 // xby_neq_0_then_la1 + cpx #0 + bne flip__B3_from_B3 +flip__Breturn: + rts +prepare: +prepare__B1_from_prepare: + // (byte) prepare::i#2 = (byte) 0 // xby=coby1 + ldx #0 +prepare__B1_from_B1: + // (byte) prepare::i#2 = (byte) prepare::i#1 // register copy +prepare__B1: + // *((word) 4096 + (byte) prepare::i#2) ← (byte) prepare::i#2 // ptr_cowo1_xby=xby + txa + sta 4096,x + // (byte) prepare::i#1 ← ++ (byte) prepare::i#2 // xby=_inc_xby + inx + // if((byte) prepare::i#1!=(byte) 0) goto prepare::@1 // xby_neq_0_then_la1 + cpx #0 + bne prepare__B1_from_B1 +prepare__Breturn: + rts + +FINAL SYMBOL TABLE +(label) @12 +(label) @17 +(label) @18 +(label) @2 +(label) @3 +(label) @8 +(label) @BEGIN +(label) @END +(byte*) RASTER +(byte[1000]) SCREEN +(byte[256]) buffer1 +(byte[256]) buffer2 +(void()) flip() +(byte~) flip::$0 reg byte a +(byte~) flip::$4 reg byte a +(label) flip::@1 +(label) flip::@2 +(label) flip::@3 +(label) flip::@return +(byte) flip::c +(byte) flip::c#1 zp byte:103 +(byte) flip::c#2 zp byte:103 +(byte) flip::dstIdx +(byte) flip::dstIdx#1 reg byte y +(byte) flip::dstIdx#2 reg byte y +(byte) flip::dstIdx#3 reg byte y +(byte) flip::dstIdx#5 reg byte y +(byte) flip::i +(byte) flip::i#1 reg byte x +(byte) flip::i#2 reg byte x +(byte) flip::r +(byte) flip::r#1 zp byte:104 +(byte) flip::r#2 zp byte:104 +(byte) flip::srcIdx +(byte) flip::srcIdx#1 reg byte x +(byte) flip::srcIdx#2 reg byte x +(byte) flip::srcIdx#3 reg byte x + +(void()) main() +(byte~) main::$1 reg byte a +(byte~) main::$3 reg byte a +(label) main::@2 +(label) main::@3 +(label) main::@4 +(label) main::@return +(byte) main::c +(byte) main::c#1 reg byte x +(byte) main::c#2 reg byte x + +(void()) plot() +(byte~) plot::$3 reg byte a +(label) plot::@1 +(label) plot::@2 +(label) plot::@return +(byte) plot::i +(byte) plot::i#1 reg byte x +(byte) plot::i#2 reg byte x +(byte) plot::i#3 reg byte x +(byte*) plot::line +(byte*) plot::line#1 zp ptr byte:101 +(byte*) plot::line#2 zp ptr byte:101 +(byte) plot::x +(byte) plot::x#1 reg byte y +(byte) plot::x#2 reg byte y +(byte) plot::y +(byte) plot::y#1 zp byte:100 +(byte) plot::y#2 zp byte:100 + +(void()) prepare() +(label) prepare::@1 +(label) prepare::@return +(byte) prepare::i +(byte) prepare::i#1 reg byte x +(byte) prepare::i#2 reg byte x + + +FINAL CODE +BBEGIN: + jsr main +BEND: +main: + jsr prepare +main__B2_from_main: + // (byte) main::c#2 = (byte) 25 // xby=coby1 + ldx #25 + jmp main__B2 +main__B2_from_B18: + // (byte) main::c#2 = (byte) 25 // xby=coby1 + ldx #25 +main__B2_from_B2: + // (byte) main::c#2 = (byte) main::c#1 // register copy +main__B2: +main__B3: + // (byte~) main::$1 ← * (word) 53266 // aby=_star_cowo1 + lda 53266 + // if((byte~) main::$1!=(byte) 254) goto main::@3 // aby_neq_coby1_then_la1 + cmp #254 + bne main__main__B3 +main__B4: + // (byte~) main::$3 ← * (word) 53266 // aby=_star_cowo1 + lda 53266 + // if((byte~) main::$3!=(byte) 255) goto main::@4 // aby_neq_coby1_then_la1 + cmp #255 + bne main__main__B4 +B2: + // (byte) main::c#1 ← -- (byte) main::c#2 // xby=_dec_xby + dex + // if((byte) main::c#1!=(byte) 0) goto main::@2 // xby_neq_0_then_la1 + cpx #0 + bne main__B2_from_B2 +B3: + jsr flip +B17: + jsr plot +B18: + // if(true) goto main::@2 // true_then_la1 + jmp main__B2_from_B18 +main__Breturn: + rts +plot: +plot__B1_from_plot: + // (byte) plot::y#2 = (byte) 16 // zpby1=coby1 + lda #16 + sta 100 + // (byte) plot::i#3 = (byte) 0 // xby=coby1 + ldx #0 + // (byte*) plot::line#2 = (word) 1236 // zpptrby1=cowo1 + lda #<1236 + sta 101 + lda #>1236 + sta 101+1 +plot__B1_from_B12: + // (byte) plot::y#2 = (byte) plot::y#1 // register copy + // (byte) plot::i#3 = (byte) plot::i#1 // register copy + // (byte*) plot::line#2 = (byte*) plot::line#1 // register copy +plot__B1: +plot__B2_from_B1: + // (byte) plot::x#2 = (byte) 0 // yby=coby1 + ldy #0 + // (byte) plot::i#2 = (byte) plot::i#3 // register copy +plot__B2_from_B2: + // (byte) plot::x#2 = (byte) plot::x#1 // register copy + // (byte) plot::i#2 = (byte) plot::i#1 // register copy +plot__B2: + // (byte~) plot::$3 ← (word) 4096 *idx (byte) plot::i#2 // aby=cowo1_staridx_xby + lda 4096,x + // *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 // ptr_zpptrby1_yby=aby + sta (101),y + // (byte) plot::i#1 ← ++ (byte) plot::i#2 // xby=_inc_xby + inx + // (byte) plot::x#1 ← ++ (byte) plot::x#2 // yby=_inc_yby + iny + // if((byte) plot::x#1<(byte) 16) goto plot::@2 // yby_lt_coby1_then_la1 + cpy #16 + bcc plot__B2_from_B2 +B12: + // (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 // zpptrby1=zpptrby1_plus_coby1 + lda 101 + clc + adc #40 + sta 101 + bcc !+ + inc 101+1 +!: + // (byte) plot::y#1 ← -- (byte) plot::y#2 // zpby1=_dec_zpby1 + dec 100 + // if((byte) plot::y#1!=(byte) 0) goto plot::@1 // zpby1_neq_0_then_la1 + lda 100 + bne plot__B1_from_B12 +plot__Breturn: + rts +flip: +flip__B1_from_flip: + // (byte) flip::r#2 = (byte) 16 // zpby1=coby1 + lda #16 + sta 104 + // (byte) flip::srcIdx#3 = (byte) 0 // xby=coby1 + ldx #0 + // (byte) flip::dstIdx#5 = (byte) 15 // yby=coby1 + ldy #15 +flip__B1_from_B8: + // (byte) flip::r#2 = (byte) flip::r#1 // register copy + // (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 // register copy + // (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 // register copy +flip__B1: +flip__B2_from_B1: + // (byte) flip::c#2 = (byte) 16 // zpby1=coby1 + lda #16 + sta 103 + // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 // register copy + // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 // register copy +flip__B2_from_B2: + // (byte) flip::c#2 = (byte) flip::c#1 // register copy + // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 // register copy + // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 // register copy +flip__B2: + // (byte~) flip::$0 ← (word) 4096 *idx (byte) flip::srcIdx#2 // aby=cowo1_staridx_xby + lda 4096,x + // *((word) 4352 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 // ptr_cowo1_yby=aby + sta 4352,y + // (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 // xby=_inc_xby + inx + // (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 // yby=yby_plus_coby1 + tya + clc + adc #16 + tay + // (byte) flip::c#1 ← -- (byte) flip::c#2 // zpby1=_dec_zpby1 + dec 103 + // if((byte) flip::c#1!=(byte) 0) goto flip::@2 // zpby1_neq_0_then_la1 + lda 103 + bne flip__B2_from_B2 +B8: + // (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 // yby=_dec_yby + dey + // (byte) flip::r#1 ← -- (byte) flip::r#2 // zpby1=_dec_zpby1 + dec 104 + // if((byte) flip::r#1!=(byte) 0) goto flip::@1 // zpby1_neq_0_then_la1 + lda 104 + bne flip__B1_from_B8 +flip__B3_from_B8: // (byte) flip::i#2 = (byte) 0 // xby=coby1 ldx #0 flip__B3_from_B3: diff --git a/src/dk/camelot64/kickc/test/ref/flipper-rex2.sym b/src/dk/camelot64/kickc/test/ref/flipper-rex2.sym index 73cc87f2a..44c71a0cf 100644 --- a/src/dk/camelot64/kickc/test/ref/flipper-rex2.sym +++ b/src/dk/camelot64/kickc/test/ref/flipper-rex2.sym @@ -1,23 +1,15 @@ -(byte~) $1 reg byte a -(byte~) $3 reg byte a -(label) @11 -(label) @15 -(label) @19 +(label) @12 +(label) @17 +(label) @18 (label) @2 -(label) @20 (label) @3 -(label) @4 -(label) @6 -(label) @7 +(label) @8 (label) @BEGIN (label) @END (byte*) RASTER (byte[1000]) SCREEN (byte[256]) buffer1 (byte[256]) buffer2 -(byte) c -(byte) c#1 reg byte x -(byte) c#2 reg byte x (void()) flip() (byte~) flip::$0 reg byte a (byte~) flip::$4 reg byte a @@ -44,6 +36,17 @@ (byte) flip::srcIdx#2 reg byte x (byte) flip::srcIdx#3 reg byte x +(void()) main() +(byte~) main::$1 reg byte a +(byte~) main::$3 reg byte a +(label) main::@2 +(label) main::@3 +(label) main::@4 +(label) main::@return +(byte) main::c +(byte) main::c#1 reg byte x +(byte) main::c#2 reg byte x + (void()) plot() (byte~) plot::$3 reg byte a (label) plot::@1