mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-12-24 04:31:02 +00:00
Declared constants only create a single version. Closes #34.
This commit is contained in:
parent
0323fb0a0d
commit
ee5b113b3a
@ -118,6 +118,26 @@ public abstract class Scope implements Symbol {
|
|||||||
return symbol;
|
return symbol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all versions of an unversioned variable
|
||||||
|
* @param unversioned The unversioned variable
|
||||||
|
* @return All versions of the variable
|
||||||
|
*/
|
||||||
|
public Collection<VariableVersion> getVersions(VariableUnversioned unversioned) {
|
||||||
|
LinkedHashSet<VariableVersion> versions = new LinkedHashSet<>();
|
||||||
|
for (Symbol symbol : symbols.values()) {
|
||||||
|
if(symbol instanceof VariableVersion) {
|
||||||
|
if(((VariableVersion) symbol).isVersioned()) {
|
||||||
|
if(((VariableVersion) symbol).getVersionOf().equals(unversioned)) {
|
||||||
|
versions.add((VariableVersion) symbol);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return versions;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public String allocateIntermediateVariableName() {
|
public String allocateIntermediateVariableName() {
|
||||||
return "$" + intermediateVarCount++;
|
return "$" + intermediateVarCount++;
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package dk.camelot64.kickc.passes;
|
|||||||
|
|
||||||
import dk.camelot64.kickc.model.*;
|
import dk.camelot64.kickc.model.*;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@ -45,6 +46,9 @@ public class Pass1GenerateSingleStaticAssignmentForm extends Pass1Base {
|
|||||||
// Assignment to a non-versioned non-intermediary variable
|
// Assignment to a non-versioned non-intermediary variable
|
||||||
VariableUnversioned assignedSymbol = (VariableUnversioned) assignedVar;
|
VariableUnversioned assignedSymbol = (VariableUnversioned) assignedVar;
|
||||||
VariableVersion version = assignedSymbol.createVersion();
|
VariableVersion version = assignedSymbol.createVersion();
|
||||||
|
if(assignedSymbol.isDeclaredConstant()) {
|
||||||
|
version.setDeclaredConstant(true);
|
||||||
|
}
|
||||||
statementLValue.setlValue(version.getRef());
|
statementLValue.setlValue(version.getRef());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -164,15 +168,26 @@ public class Pass1GenerateSingleStaticAssignmentForm extends Pass1Base {
|
|||||||
if (rValueVar instanceof VariableUnversioned) {
|
if (rValueVar instanceof VariableUnversioned) {
|
||||||
// rValue needs versioning - look for version in statements
|
// rValue needs versioning - look for version in statements
|
||||||
VariableUnversioned rSymbol = (VariableUnversioned) rValueVar;
|
VariableUnversioned rSymbol = (VariableUnversioned) rValueVar;
|
||||||
version = blockVersions.get(rSymbol);
|
if(rSymbol.isDeclaredConstant()) {
|
||||||
if (version == null) {
|
// A constant - find the single created version
|
||||||
// look for version in new phi functions
|
Scope scope = rSymbol.getScope();
|
||||||
version = blockNewPhis.get(rSymbol);
|
Collection<VariableVersion> versions = scope.getVersions(rSymbol);
|
||||||
}
|
if(versions.size()!=1) {
|
||||||
if (version == null) {
|
throw new RuntimeException("Error! Constants always must exactly one version "+rSymbol);
|
||||||
// create a new phi function
|
}
|
||||||
version = rSymbol.createVersion();
|
return versions.iterator().next();
|
||||||
blockNewPhis.put(rSymbol, version);
|
} else {
|
||||||
|
// A proper variable - find or create version
|
||||||
|
version = blockVersions.get(rSymbol);
|
||||||
|
if (version == null) {
|
||||||
|
// look for version in new phi functions
|
||||||
|
version = blockNewPhis.get(rSymbol);
|
||||||
|
}
|
||||||
|
if (version == null) {
|
||||||
|
// create a new phi function
|
||||||
|
version = rSymbol.createVersion();
|
||||||
|
blockNewPhis.put(rSymbol, version);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,15 @@ public class TestPrograms extends TestCase {
|
|||||||
helper = new ReferenceHelper("dk/camelot64/kickc/test/ref/");
|
helper = new ReferenceHelper("dk/camelot64/kickc/test/ref/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testConstantAbsMin() throws IOException, URISyntaxException {
|
||||||
|
compileAndCompare("constabsmin");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void testBasicFloats() throws IOException, URISyntaxException {
|
||||||
|
compileAndCompare("basic-floats");
|
||||||
|
}
|
||||||
|
|
||||||
public void testDoubleImport() throws IOException, URISyntaxException {
|
public void testDoubleImport() throws IOException, URISyntaxException {
|
||||||
compileAndCompare("double-import");
|
compileAndCompare("double-import");
|
||||||
}
|
}
|
||||||
|
19
src/main/java/dk/camelot64/kickc/test/basic-floats.kc
Normal file
19
src/main/java/dk/camelot64/kickc/test/basic-floats.kc
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
|
||||||
|
// Load word register Y,A into FAC (floating point accumulator)
|
||||||
|
asm {
|
||||||
|
lda #$55
|
||||||
|
ldy #$aa
|
||||||
|
jsr $b391
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load FAC (floating point accumulator) integer part into word register Y,A
|
||||||
|
asm {
|
||||||
|
jsr $b1aa
|
||||||
|
sty $fe
|
||||||
|
sta $ff
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
5
src/main/java/dk/camelot64/kickc/test/constabsmin.kc
Normal file
5
src/main/java/dk/camelot64/kickc/test/constabsmin.kc
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
const byte* SCREEN = $0400;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
*SCREEN = 1;
|
||||||
|
}
|
13
src/main/java/dk/camelot64/kickc/test/ref/basic-floats.asm
Normal file
13
src/main/java/dk/camelot64/kickc/test/ref/basic-floats.asm
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
.pc = $801 "Basic"
|
||||||
|
:BasicUpstart(main)
|
||||||
|
.pc = $80d "Program"
|
||||||
|
jsr main
|
||||||
|
main: {
|
||||||
|
lda #$55
|
||||||
|
ldy #$aa
|
||||||
|
jsr $b391
|
||||||
|
jsr $b1aa
|
||||||
|
sty $fe
|
||||||
|
sta $ff
|
||||||
|
rts
|
||||||
|
}
|
16
src/main/java/dk/camelot64/kickc/test/ref/basic-floats.cfg
Normal file
16
src/main/java/dk/camelot64/kickc/test/ref/basic-floats.cfg
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
@begin: scope:[] from
|
||||||
|
[0] phi() [ ] ( )
|
||||||
|
to:@1
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
[1] phi() [ ] ( )
|
||||||
|
[2] call main param-assignment [ ] ( )
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
[3] phi() [ ] ( )
|
||||||
|
main: scope:[main] from @1
|
||||||
|
asm { lda#$55ldy#$aajsr$b391 }
|
||||||
|
asm { jsr$b1aasty$festa$ff }
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
[6] return [ ] ( main:2 [ ] )
|
||||||
|
to:@return
|
439
src/main/java/dk/camelot64/kickc/test/ref/basic-floats.log
Normal file
439
src/main/java/dk/camelot64/kickc/test/ref/basic-floats.log
Normal file
@ -0,0 +1,439 @@
|
|||||||
|
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
|
||||||
|
// Load word register Y,A into FAC (floating point accumulator)
|
||||||
|
asm {
|
||||||
|
lda #$55
|
||||||
|
ldy #$aa
|
||||||
|
jsr $b391
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load FAC (floating point accumulator) integer part into word register Y,A
|
||||||
|
asm {
|
||||||
|
jsr $b1aa
|
||||||
|
sty $fe
|
||||||
|
sta $ff
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
PROGRAM
|
||||||
|
proc (void()) main()
|
||||||
|
asm { lda#$55ldy#$aajsr$b391 }
|
||||||
|
asm { jsr$b1aasty$festa$ff }
|
||||||
|
main::@return:
|
||||||
|
return
|
||||||
|
endproc // main()
|
||||||
|
call main
|
||||||
|
|
||||||
|
SYMBOLS
|
||||||
|
(void()) main()
|
||||||
|
(label) main::@return
|
||||||
|
|
||||||
|
INITIAL CONTROL FLOW GRAPH
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from
|
||||||
|
asm { lda#$55ldy#$aajsr$b391 }
|
||||||
|
asm { jsr$b1aasty$festa$ff }
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
|
||||||
|
CONTROL FLOW GRAPH
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from
|
||||||
|
asm { lda#$55ldy#$aajsr$b391 }
|
||||||
|
asm { jsr$b1aasty$festa$ff }
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
|
||||||
|
PROCEDURE MODIFY VARIABLE ANALYSIS
|
||||||
|
|
||||||
|
CONTROL FLOW GRAPH WITH ASSIGNMENT CALL
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
asm { lda#$55ldy#$aajsr$b391 }
|
||||||
|
asm { jsr$b1aasty$festa$ff }
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@2
|
||||||
|
@2: scope:[] from @1
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @2
|
||||||
|
|
||||||
|
Completing Phi functions...
|
||||||
|
CONTROL FLOW GRAPH SSA
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
asm { lda#$55ldy#$aajsr$b391 }
|
||||||
|
asm { jsr$b1aasty$festa$ff }
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@2
|
||||||
|
@2: scope:[] from @1
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @2
|
||||||
|
|
||||||
|
CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
asm { lda#$55ldy#$aajsr$b391 }
|
||||||
|
asm { jsr$b1aasty$festa$ff }
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@2
|
||||||
|
@2: scope:[] from @1
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @2
|
||||||
|
|
||||||
|
INITIAL SSA SYMBOL TABLE
|
||||||
|
(label) @1
|
||||||
|
(label) @2
|
||||||
|
(label) @begin
|
||||||
|
(label) @end
|
||||||
|
(void()) main()
|
||||||
|
(label) main::@return
|
||||||
|
|
||||||
|
Culled Empty Block (label) @2
|
||||||
|
Succesful SSA optimization Pass2CullEmptyBlocks
|
||||||
|
CONTROL FLOW GRAPH
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
asm { lda#$55ldy#$aajsr$b391 }
|
||||||
|
asm { jsr$b1aasty$festa$ff }
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
|
||||||
|
FINAL SYMBOL TABLE
|
||||||
|
(label) @1
|
||||||
|
(label) @begin
|
||||||
|
(label) @end
|
||||||
|
(void()) main()
|
||||||
|
(label) main::@return
|
||||||
|
|
||||||
|
Block Sequence Planned @begin @1 @end main main::@return
|
||||||
|
Block Sequence Planned @begin @1 @end main main::@return
|
||||||
|
CONTROL FLOW GRAPH - PHI LIFTED
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
asm { lda#$55ldy#$aajsr$b391 }
|
||||||
|
asm { jsr$b1aasty$festa$ff }
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
|
||||||
|
Adding NOP phi() at start of @begin
|
||||||
|
Adding NOP phi() at start of @1
|
||||||
|
Adding NOP phi() at start of @end
|
||||||
|
CALL GRAPH
|
||||||
|
Calls in [] to main:2
|
||||||
|
|
||||||
|
Propagating live ranges...
|
||||||
|
CONTROL FLOW GRAPH - LIVE RANGES FOUND
|
||||||
|
@begin: scope:[] from
|
||||||
|
[0] phi() [ ]
|
||||||
|
to:@1
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
[1] phi() [ ]
|
||||||
|
[2] call main param-assignment [ ]
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
[3] phi() [ ]
|
||||||
|
main: scope:[main] from @1
|
||||||
|
asm { lda#$55ldy#$aajsr$b391 }
|
||||||
|
asm { jsr$b1aasty$festa$ff }
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
[6] return [ ]
|
||||||
|
to:@return
|
||||||
|
|
||||||
|
Created 0 initial phi equivalence classes
|
||||||
|
Coalesced down to 0 phi equivalence classes
|
||||||
|
Block Sequence Planned @begin @1 @end main main::@return
|
||||||
|
Adding NOP phi() at start of @begin
|
||||||
|
Adding NOP phi() at start of @1
|
||||||
|
Adding NOP phi() at start of @end
|
||||||
|
Propagating live ranges...
|
||||||
|
CONTROL FLOW GRAPH - BEFORE EFFECTIVE LIVE RANGES
|
||||||
|
@begin: scope:[] from
|
||||||
|
[0] phi() [ ]
|
||||||
|
to:@1
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
[1] phi() [ ]
|
||||||
|
[2] call main param-assignment [ ]
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
[3] phi() [ ]
|
||||||
|
main: scope:[main] from @1
|
||||||
|
asm { lda#$55ldy#$aajsr$b391 }
|
||||||
|
asm { jsr$b1aasty$festa$ff }
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
[6] return [ ]
|
||||||
|
to:@return
|
||||||
|
|
||||||
|
CONTROL FLOW GRAPH - PHI MEM COALESCED
|
||||||
|
@begin: scope:[] from
|
||||||
|
[0] phi() [ ] ( )
|
||||||
|
to:@1
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
[1] phi() [ ] ( )
|
||||||
|
[2] call main param-assignment [ ] ( )
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
[3] phi() [ ] ( )
|
||||||
|
main: scope:[main] from @1
|
||||||
|
asm { lda#$55ldy#$aajsr$b391 }
|
||||||
|
asm { jsr$b1aasty$festa$ff }
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
[6] return [ ] ( main:2 [ ] )
|
||||||
|
to:@return
|
||||||
|
|
||||||
|
DOMINATORS
|
||||||
|
@begin dominated by @begin
|
||||||
|
@1 dominated by @1 @begin
|
||||||
|
@end dominated by @1 @begin @end
|
||||||
|
main dominated by @1 @begin main
|
||||||
|
main::@return dominated by main::@return @1 @begin main
|
||||||
|
|
||||||
|
NATURAL LOOPS
|
||||||
|
|
||||||
|
Found 0 loops in scope []
|
||||||
|
Found 0 loops in scope [main]
|
||||||
|
NATURAL LOOPS WITH DEPTH
|
||||||
|
|
||||||
|
|
||||||
|
VARIABLE REGISTER WEIGHTS
|
||||||
|
(void()) main()
|
||||||
|
|
||||||
|
Initial phi equivalence classes
|
||||||
|
Complete equivalence classes
|
||||||
|
INITIAL ASM
|
||||||
|
//SEG0 Basic Upstart
|
||||||
|
.pc = $801 "Basic"
|
||||||
|
:BasicUpstart(main)
|
||||||
|
.pc = $80d "Program"
|
||||||
|
//SEG1 Global Constants & labels
|
||||||
|
//SEG2 @begin
|
||||||
|
bbegin:
|
||||||
|
//SEG3 [1] phi from @begin to @1 [phi:@begin->@1]
|
||||||
|
b1_from_bbegin:
|
||||||
|
jmp b1
|
||||||
|
//SEG4 @1
|
||||||
|
b1:
|
||||||
|
//SEG5 [2] call main param-assignment [ ] ( )
|
||||||
|
jsr main
|
||||||
|
//SEG6 [3] phi from @1 to @end [phi:@1->@end]
|
||||||
|
bend_from_b1:
|
||||||
|
jmp bend
|
||||||
|
//SEG7 @end
|
||||||
|
bend:
|
||||||
|
//SEG8 main
|
||||||
|
main: {
|
||||||
|
//SEG9 asm { lda#$55ldy#$aajsr$b391 }
|
||||||
|
lda #$55
|
||||||
|
ldy #$aa
|
||||||
|
jsr $b391
|
||||||
|
//SEG10 asm { jsr$b1aasty$festa$ff }
|
||||||
|
jsr $b1aa
|
||||||
|
sty $fe
|
||||||
|
sta $ff
|
||||||
|
jmp breturn
|
||||||
|
//SEG11 main::@return
|
||||||
|
breturn:
|
||||||
|
//SEG12 [6] return [ ] ( main:2 [ ] )
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
|
||||||
|
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||||
|
Statement asm { lda#$55ldy#$aajsr$b391 } always clobbers reg byte a reg byte y
|
||||||
|
|
||||||
|
REGISTER UPLIFT SCOPES
|
||||||
|
Uplift Scope [main]
|
||||||
|
Uplift Scope []
|
||||||
|
|
||||||
|
Uplifting [main] best 45 combination
|
||||||
|
Uplifting [] best 45 combination
|
||||||
|
Removing instruction jmp b1
|
||||||
|
Removing instruction jmp bend
|
||||||
|
Removing instruction jmp breturn
|
||||||
|
Succesful ASM optimization Pass5NextJumpElimination
|
||||||
|
ASSEMBLER
|
||||||
|
//SEG0 Basic Upstart
|
||||||
|
.pc = $801 "Basic"
|
||||||
|
:BasicUpstart(main)
|
||||||
|
.pc = $80d "Program"
|
||||||
|
//SEG1 Global Constants & labels
|
||||||
|
//SEG2 @begin
|
||||||
|
bbegin:
|
||||||
|
//SEG3 [1] phi from @begin to @1 [phi:@begin->@1]
|
||||||
|
b1_from_bbegin:
|
||||||
|
//SEG4 @1
|
||||||
|
b1:
|
||||||
|
//SEG5 [2] call main param-assignment [ ] ( )
|
||||||
|
jsr main
|
||||||
|
//SEG6 [3] phi from @1 to @end [phi:@1->@end]
|
||||||
|
bend_from_b1:
|
||||||
|
//SEG7 @end
|
||||||
|
bend:
|
||||||
|
//SEG8 main
|
||||||
|
main: {
|
||||||
|
//SEG9 asm { lda#$55ldy#$aajsr$b391 }
|
||||||
|
lda #$55
|
||||||
|
ldy #$aa
|
||||||
|
jsr $b391
|
||||||
|
//SEG10 asm { jsr$b1aasty$festa$ff }
|
||||||
|
jsr $b1aa
|
||||||
|
sty $fe
|
||||||
|
sta $ff
|
||||||
|
//SEG11 main::@return
|
||||||
|
breturn:
|
||||||
|
//SEG12 [6] return [ ] ( main:2 [ ] )
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
|
||||||
|
Removing instruction bbegin:
|
||||||
|
Removing instruction b1_from_bbegin:
|
||||||
|
Removing instruction bend_from_b1:
|
||||||
|
Succesful ASM optimization Pass5RedundantLabelElimination
|
||||||
|
ASSEMBLER
|
||||||
|
//SEG0 Basic Upstart
|
||||||
|
.pc = $801 "Basic"
|
||||||
|
:BasicUpstart(main)
|
||||||
|
.pc = $80d "Program"
|
||||||
|
//SEG1 Global Constants & labels
|
||||||
|
//SEG2 @begin
|
||||||
|
//SEG3 [1] phi from @begin to @1 [phi:@begin->@1]
|
||||||
|
//SEG4 @1
|
||||||
|
b1:
|
||||||
|
//SEG5 [2] call main param-assignment [ ] ( )
|
||||||
|
jsr main
|
||||||
|
//SEG6 [3] phi from @1 to @end [phi:@1->@end]
|
||||||
|
//SEG7 @end
|
||||||
|
bend:
|
||||||
|
//SEG8 main
|
||||||
|
main: {
|
||||||
|
//SEG9 asm { lda#$55ldy#$aajsr$b391 }
|
||||||
|
lda #$55
|
||||||
|
ldy #$aa
|
||||||
|
jsr $b391
|
||||||
|
//SEG10 asm { jsr$b1aasty$festa$ff }
|
||||||
|
jsr $b1aa
|
||||||
|
sty $fe
|
||||||
|
sta $ff
|
||||||
|
//SEG11 main::@return
|
||||||
|
breturn:
|
||||||
|
//SEG12 [6] return [ ] ( main:2 [ ] )
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
|
||||||
|
Removing instruction b1:
|
||||||
|
Removing instruction bend:
|
||||||
|
Removing instruction breturn:
|
||||||
|
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||||
|
ASSEMBLER
|
||||||
|
//SEG0 Basic Upstart
|
||||||
|
.pc = $801 "Basic"
|
||||||
|
:BasicUpstart(main)
|
||||||
|
.pc = $80d "Program"
|
||||||
|
//SEG1 Global Constants & labels
|
||||||
|
//SEG2 @begin
|
||||||
|
//SEG3 [1] phi from @begin to @1 [phi:@begin->@1]
|
||||||
|
//SEG4 @1
|
||||||
|
//SEG5 [2] call main param-assignment [ ] ( )
|
||||||
|
jsr main
|
||||||
|
//SEG6 [3] phi from @1 to @end [phi:@1->@end]
|
||||||
|
//SEG7 @end
|
||||||
|
//SEG8 main
|
||||||
|
main: {
|
||||||
|
//SEG9 asm { lda#$55ldy#$aajsr$b391 }
|
||||||
|
lda #$55
|
||||||
|
ldy #$aa
|
||||||
|
jsr $b391
|
||||||
|
//SEG10 asm { jsr$b1aasty$festa$ff }
|
||||||
|
jsr $b1aa
|
||||||
|
sty $fe
|
||||||
|
sta $ff
|
||||||
|
//SEG11 main::@return
|
||||||
|
//SEG12 [6] return [ ] ( main:2 [ ] )
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
|
||||||
|
FINAL SYMBOL TABLE
|
||||||
|
(label) @1
|
||||||
|
(label) @begin
|
||||||
|
(label) @end
|
||||||
|
(void()) main()
|
||||||
|
(label) main::@return
|
||||||
|
|
||||||
|
|
||||||
|
FINAL CODE
|
||||||
|
//SEG0 Basic Upstart
|
||||||
|
.pc = $801 "Basic"
|
||||||
|
:BasicUpstart(main)
|
||||||
|
.pc = $80d "Program"
|
||||||
|
//SEG1 Global Constants & labels
|
||||||
|
//SEG2 @begin
|
||||||
|
//SEG3 [1] phi from @begin to @1 [phi:@begin->@1]
|
||||||
|
//SEG4 @1
|
||||||
|
//SEG5 [2] call main param-assignment [ ] ( )
|
||||||
|
jsr main
|
||||||
|
//SEG6 [3] phi from @1 to @end [phi:@1->@end]
|
||||||
|
//SEG7 @end
|
||||||
|
//SEG8 main
|
||||||
|
main: {
|
||||||
|
//SEG9 asm { lda#$55ldy#$aajsr$b391 }
|
||||||
|
lda #$55
|
||||||
|
ldy #$aa
|
||||||
|
jsr $b391
|
||||||
|
//SEG10 asm { jsr$b1aasty$festa$ff }
|
||||||
|
jsr $b1aa
|
||||||
|
sty $fe
|
||||||
|
sta $ff
|
||||||
|
//SEG11 main::@return
|
||||||
|
//SEG12 [6] return [ ] ( main:2 [ ] )
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,6 @@
|
|||||||
|
(label) @1
|
||||||
|
(label) @begin
|
||||||
|
(label) @end
|
||||||
|
(void()) main()
|
||||||
|
(label) main::@return
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -314,8 +314,6 @@ plot::@return: scope:[plot] from plot
|
|||||||
to:@end
|
to:@end
|
||||||
@end: scope:[] from @4
|
@end: scope:[] from @4
|
||||||
|
|
||||||
Completing Phi functions...
|
|
||||||
Completing Phi functions...
|
|
||||||
Completing Phi functions...
|
Completing Phi functions...
|
||||||
Completing Phi functions...
|
Completing Phi functions...
|
||||||
Completing Phi functions...
|
Completing Phi functions...
|
||||||
@ -325,38 +323,28 @@ CONTROL FLOW GRAPH SSA
|
|||||||
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
|
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
|
||||||
to:@3
|
to:@3
|
||||||
main: scope:[main] from @3
|
main: scope:[main] from @3
|
||||||
(byte*) SCREEN#3 ← phi( @3/(byte*) SCREEN#6 )
|
|
||||||
(byte[]) plots#3 ← phi( @3/(byte[]) plots#6 )
|
|
||||||
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
||||||
to:main::@1
|
to:main::@1
|
||||||
main::@1: scope:[main] from main main::@1
|
main::@1: scope:[main] from main main::@1
|
||||||
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#3 main::@1/(byte*) SCREEN#1 )
|
|
||||||
(byte[]) plots#1 ← phi( main/(byte[]) plots#3 main::@1/(byte[]) plots#1 )
|
|
||||||
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||||
*((byte[]) plots#1 + (byte) main::i#2) ← (byte) main::i#2
|
*((byte[]) plots#0 + (byte) main::i#2) ← (byte) main::i#2
|
||||||
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte/signed byte/word/signed word) 0
|
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte/signed byte/word/signed word) 0
|
||||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||||
(boolean~) main::$0 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
|
(boolean~) main::$0 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
|
||||||
if((boolean~) main::$0) goto main::@1
|
if((boolean~) main::$0) goto main::@1
|
||||||
to:main::@2
|
to:main::@2
|
||||||
main::@2: scope:[main] from main::@1 main::@5
|
main::@2: scope:[main] from main::@1 main::@5
|
||||||
(byte*) SCREEN#10 ← phi( main::@1/(byte*) SCREEN#1 main::@5/(byte*) SCREEN#11 )
|
|
||||||
(byte[]) plots#10 ← phi( main::@1/(byte[]) plots#1 main::@5/(byte[]) plots#11 )
|
|
||||||
(byte) line::x0#0 ← (byte/signed byte/word/signed word) 0
|
(byte) line::x0#0 ← (byte/signed byte/word/signed word) 0
|
||||||
(byte) line::x1#0 ← (byte/signed byte/word/signed word) 10
|
(byte) line::x1#0 ← (byte/signed byte/word/signed word) 10
|
||||||
call line param-assignment
|
call line param-assignment
|
||||||
to:main::@5
|
to:main::@5
|
||||||
main::@5: scope:[main] from main::@2
|
main::@5: scope:[main] from main::@2
|
||||||
(byte*) SCREEN#11 ← phi( main::@2/(byte*) SCREEN#10 )
|
|
||||||
(byte[]) plots#11 ← phi( main::@2/(byte[]) plots#10 )
|
|
||||||
if(true) goto main::@2
|
if(true) goto main::@2
|
||||||
to:main::@return
|
to:main::@return
|
||||||
main::@return: scope:[main] from main::@5
|
main::@return: scope:[main] from main::@5
|
||||||
return
|
return
|
||||||
to:@return
|
to:@return
|
||||||
line: scope:[line] from main::@2
|
line: scope:[line] from main::@2
|
||||||
(byte*) SCREEN#7 ← phi( main::@2/(byte*) SCREEN#10 )
|
|
||||||
(byte[]) plots#7 ← phi( main::@2/(byte[]) plots#10 )
|
|
||||||
(byte) line::x1#1 ← phi( main::@2/(byte) line::x1#0 )
|
(byte) line::x1#1 ← phi( main::@2/(byte) line::x1#0 )
|
||||||
(byte) line::x0#1 ← phi( main::@2/(byte) line::x0#0 )
|
(byte) line::x0#1 ← phi( main::@2/(byte) line::x0#0 )
|
||||||
(boolean~) line::$0 ← (byte) line::x0#1 < (byte) line::x1#1
|
(boolean~) line::$0 ← (byte) line::x0#1 < (byte) line::x1#1
|
||||||
@ -364,8 +352,6 @@ line: scope:[line] from main::@2
|
|||||||
if((boolean~) line::$1) goto line::@1
|
if((boolean~) line::$1) goto line::@1
|
||||||
to:line::@4
|
to:line::@4
|
||||||
line::@1: scope:[line] from line
|
line::@1: scope:[line] from line
|
||||||
(byte*) SCREEN#4 ← phi( line/(byte*) SCREEN#7 )
|
|
||||||
(byte[]) plots#4 ← phi( line/(byte[]) plots#7 )
|
|
||||||
(byte) line::x0#2 ← phi( line/(byte) line::x0#1 )
|
(byte) line::x0#2 ← phi( line/(byte) line::x0#1 )
|
||||||
(byte) plot::x#0 ← (byte) line::x0#2
|
(byte) plot::x#0 ← (byte) line::x0#2
|
||||||
call plot param-assignment
|
call plot param-assignment
|
||||||
@ -373,23 +359,17 @@ line::@1: scope:[line] from line
|
|||||||
line::@7: scope:[line] from line::@1
|
line::@7: scope:[line] from line::@1
|
||||||
to:line::@return
|
to:line::@return
|
||||||
line::@4: scope:[line] from line
|
line::@4: scope:[line] from line
|
||||||
(byte*) SCREEN#8 ← phi( line/(byte*) SCREEN#7 )
|
|
||||||
(byte[]) plots#8 ← phi( line/(byte[]) plots#7 )
|
|
||||||
(byte) line::x1#4 ← phi( line/(byte) line::x1#1 )
|
(byte) line::x1#4 ← phi( line/(byte) line::x1#1 )
|
||||||
(byte) line::x0#3 ← phi( line/(byte) line::x0#1 )
|
(byte) line::x0#3 ← phi( line/(byte) line::x0#1 )
|
||||||
(byte) line::x#0 ← (byte) line::x0#3
|
(byte) line::x#0 ← (byte) line::x0#3
|
||||||
to:line::@2
|
to:line::@2
|
||||||
line::@2: scope:[line] from line::@4 line::@8
|
line::@2: scope:[line] from line::@4 line::@8
|
||||||
(byte*) SCREEN#5 ← phi( line::@4/(byte*) SCREEN#8 line::@8/(byte*) SCREEN#9 )
|
|
||||||
(byte[]) plots#5 ← phi( line::@4/(byte[]) plots#8 line::@8/(byte[]) plots#9 )
|
|
||||||
(byte) line::x1#3 ← phi( line::@4/(byte) line::x1#4 line::@8/(byte) line::x1#2 )
|
(byte) line::x1#3 ← phi( line::@4/(byte) line::x1#4 line::@8/(byte) line::x1#2 )
|
||||||
(byte) line::x#2 ← phi( line::@4/(byte) line::x#0 line::@8/(byte) line::x#1 )
|
(byte) line::x#2 ← phi( line::@4/(byte) line::x#0 line::@8/(byte) line::x#1 )
|
||||||
(byte) plot::x#1 ← (byte) line::x#2
|
(byte) plot::x#1 ← (byte) line::x#2
|
||||||
call plot param-assignment
|
call plot param-assignment
|
||||||
to:line::@8
|
to:line::@8
|
||||||
line::@8: scope:[line] from line::@2
|
line::@8: scope:[line] from line::@2
|
||||||
(byte*) SCREEN#9 ← phi( line::@2/(byte*) SCREEN#5 )
|
|
||||||
(byte[]) plots#9 ← phi( line::@2/(byte[]) plots#5 )
|
|
||||||
(byte) line::x1#2 ← phi( line::@2/(byte) line::x1#3 )
|
(byte) line::x1#2 ← phi( line::@2/(byte) line::x1#3 )
|
||||||
(byte) line::x#3 ← phi( line::@2/(byte) line::x#2 )
|
(byte) line::x#3 ← phi( line::@2/(byte) line::x#2 )
|
||||||
(byte) line::x#1 ← ++ (byte) line::x#3
|
(byte) line::x#1 ← ++ (byte) line::x#3
|
||||||
@ -400,21 +380,17 @@ line::@return: scope:[line] from line::@7 line::@8
|
|||||||
return
|
return
|
||||||
to:@return
|
to:@return
|
||||||
plot: scope:[plot] from line::@1 line::@2
|
plot: scope:[plot] from line::@1 line::@2
|
||||||
(byte*) SCREEN#2 ← phi( line::@1/(byte*) SCREEN#4 line::@2/(byte*) SCREEN#5 )
|
|
||||||
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
|
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
|
||||||
(byte[]) plots#2 ← phi( line::@1/(byte[]) plots#4 line::@2/(byte[]) plots#5 )
|
(byte~) plot::$0 ← (byte[]) plots#0 *idx (byte) plot::x#2
|
||||||
(byte~) plot::$0 ← (byte[]) plots#2 *idx (byte) plot::x#2
|
|
||||||
(byte) plot::idx#0 ← (byte~) plot::$0
|
(byte) plot::idx#0 ← (byte~) plot::$0
|
||||||
(byte~) plot::$1 ← (byte*) SCREEN#2 *idx (byte) plot::idx#0
|
(byte~) plot::$1 ← (byte*) SCREEN#0 *idx (byte) plot::idx#0
|
||||||
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
|
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
|
||||||
*((byte*) SCREEN#2 + (byte) plot::idx#0) ← (byte~) plot::$2
|
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2
|
||||||
to:plot::@return
|
to:plot::@return
|
||||||
plot::@return: scope:[plot] from plot
|
plot::@return: scope:[plot] from plot
|
||||||
return
|
return
|
||||||
to:@return
|
to:@return
|
||||||
@3: scope:[] from @begin
|
@3: scope:[] from @begin
|
||||||
(byte*) SCREEN#6 ← phi( @begin/(byte*) SCREEN#0 )
|
|
||||||
(byte[]) plots#6 ← phi( @begin/(byte[]) plots#0 )
|
|
||||||
call main param-assignment
|
call main param-assignment
|
||||||
to:@4
|
to:@4
|
||||||
@4: scope:[] from @3
|
@4: scope:[] from @3
|
||||||
@ -427,38 +403,28 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN
|
|||||||
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
|
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
|
||||||
to:@3
|
to:@3
|
||||||
main: scope:[main] from @3
|
main: scope:[main] from @3
|
||||||
(byte*) SCREEN#3 ← phi( @3/(byte*) SCREEN#6 )
|
|
||||||
(byte[]) plots#3 ← phi( @3/(byte[]) plots#6 )
|
|
||||||
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
||||||
to:main::@1
|
to:main::@1
|
||||||
main::@1: scope:[main] from main main::@1
|
main::@1: scope:[main] from main main::@1
|
||||||
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#3 main::@1/(byte*) SCREEN#1 )
|
|
||||||
(byte[]) plots#1 ← phi( main/(byte[]) plots#3 main::@1/(byte[]) plots#1 )
|
|
||||||
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||||
*((byte[]) plots#1 + (byte) main::i#2) ← (byte) main::i#2
|
*((byte[]) plots#0 + (byte) main::i#2) ← (byte) main::i#2
|
||||||
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte/signed byte/word/signed word) 0
|
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte/signed byte/word/signed word) 0
|
||||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||||
(boolean~) main::$0 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
|
(boolean~) main::$0 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
|
||||||
if((boolean~) main::$0) goto main::@1
|
if((boolean~) main::$0) goto main::@1
|
||||||
to:main::@2
|
to:main::@2
|
||||||
main::@2: scope:[main] from main::@1 main::@5
|
main::@2: scope:[main] from main::@1 main::@5
|
||||||
(byte*) SCREEN#10 ← phi( main::@1/(byte*) SCREEN#1 main::@5/(byte*) SCREEN#11 )
|
|
||||||
(byte[]) plots#10 ← phi( main::@1/(byte[]) plots#1 main::@5/(byte[]) plots#11 )
|
|
||||||
(byte) line::x0#0 ← (byte/signed byte/word/signed word) 0
|
(byte) line::x0#0 ← (byte/signed byte/word/signed word) 0
|
||||||
(byte) line::x1#0 ← (byte/signed byte/word/signed word) 10
|
(byte) line::x1#0 ← (byte/signed byte/word/signed word) 10
|
||||||
call line param-assignment
|
call line param-assignment
|
||||||
to:main::@5
|
to:main::@5
|
||||||
main::@5: scope:[main] from main::@2
|
main::@5: scope:[main] from main::@2
|
||||||
(byte*) SCREEN#11 ← phi( main::@2/(byte*) SCREEN#10 )
|
|
||||||
(byte[]) plots#11 ← phi( main::@2/(byte[]) plots#10 )
|
|
||||||
if(true) goto main::@2
|
if(true) goto main::@2
|
||||||
to:main::@return
|
to:main::@return
|
||||||
main::@return: scope:[main] from main::@5
|
main::@return: scope:[main] from main::@5
|
||||||
return
|
return
|
||||||
to:@return
|
to:@return
|
||||||
line: scope:[line] from main::@2
|
line: scope:[line] from main::@2
|
||||||
(byte*) SCREEN#7 ← phi( main::@2/(byte*) SCREEN#10 )
|
|
||||||
(byte[]) plots#7 ← phi( main::@2/(byte[]) plots#10 )
|
|
||||||
(byte) line::x1#1 ← phi( main::@2/(byte) line::x1#0 )
|
(byte) line::x1#1 ← phi( main::@2/(byte) line::x1#0 )
|
||||||
(byte) line::x0#1 ← phi( main::@2/(byte) line::x0#0 )
|
(byte) line::x0#1 ← phi( main::@2/(byte) line::x0#0 )
|
||||||
(boolean~) line::$0 ← (byte) line::x0#1 < (byte) line::x1#1
|
(boolean~) line::$0 ← (byte) line::x0#1 < (byte) line::x1#1
|
||||||
@ -466,8 +432,6 @@ line: scope:[line] from main::@2
|
|||||||
if((boolean~) line::$1) goto line::@1
|
if((boolean~) line::$1) goto line::@1
|
||||||
to:line::@4
|
to:line::@4
|
||||||
line::@1: scope:[line] from line
|
line::@1: scope:[line] from line
|
||||||
(byte*) SCREEN#4 ← phi( line/(byte*) SCREEN#7 )
|
|
||||||
(byte[]) plots#4 ← phi( line/(byte[]) plots#7 )
|
|
||||||
(byte) line::x0#2 ← phi( line/(byte) line::x0#1 )
|
(byte) line::x0#2 ← phi( line/(byte) line::x0#1 )
|
||||||
(byte) plot::x#0 ← (byte) line::x0#2
|
(byte) plot::x#0 ← (byte) line::x0#2
|
||||||
call plot param-assignment
|
call plot param-assignment
|
||||||
@ -475,23 +439,17 @@ line::@1: scope:[line] from line
|
|||||||
line::@7: scope:[line] from line::@1
|
line::@7: scope:[line] from line::@1
|
||||||
to:line::@return
|
to:line::@return
|
||||||
line::@4: scope:[line] from line
|
line::@4: scope:[line] from line
|
||||||
(byte*) SCREEN#8 ← phi( line/(byte*) SCREEN#7 )
|
|
||||||
(byte[]) plots#8 ← phi( line/(byte[]) plots#7 )
|
|
||||||
(byte) line::x1#4 ← phi( line/(byte) line::x1#1 )
|
(byte) line::x1#4 ← phi( line/(byte) line::x1#1 )
|
||||||
(byte) line::x0#3 ← phi( line/(byte) line::x0#1 )
|
(byte) line::x0#3 ← phi( line/(byte) line::x0#1 )
|
||||||
(byte) line::x#0 ← (byte) line::x0#3
|
(byte) line::x#0 ← (byte) line::x0#3
|
||||||
to:line::@2
|
to:line::@2
|
||||||
line::@2: scope:[line] from line::@4 line::@8
|
line::@2: scope:[line] from line::@4 line::@8
|
||||||
(byte*) SCREEN#5 ← phi( line::@4/(byte*) SCREEN#8 line::@8/(byte*) SCREEN#9 )
|
|
||||||
(byte[]) plots#5 ← phi( line::@4/(byte[]) plots#8 line::@8/(byte[]) plots#9 )
|
|
||||||
(byte) line::x1#3 ← phi( line::@4/(byte) line::x1#4 line::@8/(byte) line::x1#2 )
|
(byte) line::x1#3 ← phi( line::@4/(byte) line::x1#4 line::@8/(byte) line::x1#2 )
|
||||||
(byte) line::x#2 ← phi( line::@4/(byte) line::x#0 line::@8/(byte) line::x#1 )
|
(byte) line::x#2 ← phi( line::@4/(byte) line::x#0 line::@8/(byte) line::x#1 )
|
||||||
(byte) plot::x#1 ← (byte) line::x#2
|
(byte) plot::x#1 ← (byte) line::x#2
|
||||||
call plot param-assignment
|
call plot param-assignment
|
||||||
to:line::@8
|
to:line::@8
|
||||||
line::@8: scope:[line] from line::@2
|
line::@8: scope:[line] from line::@2
|
||||||
(byte*) SCREEN#9 ← phi( line::@2/(byte*) SCREEN#5 )
|
|
||||||
(byte[]) plots#9 ← phi( line::@2/(byte[]) plots#5 )
|
|
||||||
(byte) line::x1#2 ← phi( line::@2/(byte) line::x1#3 )
|
(byte) line::x1#2 ← phi( line::@2/(byte) line::x1#3 )
|
||||||
(byte) line::x#3 ← phi( line::@2/(byte) line::x#2 )
|
(byte) line::x#3 ← phi( line::@2/(byte) line::x#2 )
|
||||||
(byte) line::x#1 ← ++ (byte) line::x#3
|
(byte) line::x#1 ← ++ (byte) line::x#3
|
||||||
@ -502,21 +460,17 @@ line::@return: scope:[line] from line::@7 line::@8
|
|||||||
return
|
return
|
||||||
to:@return
|
to:@return
|
||||||
plot: scope:[plot] from line::@1 line::@2
|
plot: scope:[plot] from line::@1 line::@2
|
||||||
(byte*) SCREEN#2 ← phi( line::@1/(byte*) SCREEN#4 line::@2/(byte*) SCREEN#5 )
|
|
||||||
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
|
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
|
||||||
(byte[]) plots#2 ← phi( line::@1/(byte[]) plots#4 line::@2/(byte[]) plots#5 )
|
(byte~) plot::$0 ← (byte[]) plots#0 *idx (byte) plot::x#2
|
||||||
(byte~) plot::$0 ← (byte[]) plots#2 *idx (byte) plot::x#2
|
|
||||||
(byte) plot::idx#0 ← (byte~) plot::$0
|
(byte) plot::idx#0 ← (byte~) plot::$0
|
||||||
(byte~) plot::$1 ← (byte*) SCREEN#2 *idx (byte) plot::idx#0
|
(byte~) plot::$1 ← (byte*) SCREEN#0 *idx (byte) plot::idx#0
|
||||||
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
|
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
|
||||||
*((byte*) SCREEN#2 + (byte) plot::idx#0) ← (byte~) plot::$2
|
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2
|
||||||
to:plot::@return
|
to:plot::@return
|
||||||
plot::@return: scope:[plot] from plot
|
plot::@return: scope:[plot] from plot
|
||||||
return
|
return
|
||||||
to:@return
|
to:@return
|
||||||
@3: scope:[] from @begin
|
@3: scope:[] from @begin
|
||||||
(byte*) SCREEN#6 ← phi( @begin/(byte*) SCREEN#0 )
|
|
||||||
(byte[]) plots#6 ← phi( @begin/(byte[]) plots#0 )
|
|
||||||
call main param-assignment
|
call main param-assignment
|
||||||
to:@4
|
to:@4
|
||||||
@4: scope:[] from @3
|
@4: scope:[] from @3
|
||||||
@ -530,17 +484,6 @@ INITIAL SSA SYMBOL TABLE
|
|||||||
(label) @end
|
(label) @end
|
||||||
(byte*) SCREEN
|
(byte*) SCREEN
|
||||||
(byte*) SCREEN#0
|
(byte*) SCREEN#0
|
||||||
(byte*) SCREEN#1
|
|
||||||
(byte*) SCREEN#10
|
|
||||||
(byte*) SCREEN#11
|
|
||||||
(byte*) SCREEN#2
|
|
||||||
(byte*) SCREEN#3
|
|
||||||
(byte*) SCREEN#4
|
|
||||||
(byte*) SCREEN#5
|
|
||||||
(byte*) SCREEN#6
|
|
||||||
(byte*) SCREEN#7
|
|
||||||
(byte*) SCREEN#8
|
|
||||||
(byte*) SCREEN#9
|
|
||||||
(void()) line((byte) line::x0 , (byte) line::x1)
|
(void()) line((byte) line::x0 , (byte) line::x1)
|
||||||
(boolean~) line::$0
|
(boolean~) line::$0
|
||||||
(boolean~) line::$1
|
(boolean~) line::$1
|
||||||
@ -590,437 +533,11 @@ INITIAL SSA SYMBOL TABLE
|
|||||||
(byte) plot::x#2
|
(byte) plot::x#2
|
||||||
(byte[]) plots
|
(byte[]) plots
|
||||||
(byte[]) plots#0
|
(byte[]) plots#0
|
||||||
(byte[]) plots#1
|
|
||||||
(byte[]) plots#10
|
|
||||||
(byte[]) plots#11
|
|
||||||
(byte[]) plots#2
|
|
||||||
(byte[]) plots#3
|
|
||||||
(byte[]) plots#4
|
|
||||||
(byte[]) plots#5
|
|
||||||
(byte[]) plots#6
|
|
||||||
(byte[]) plots#7
|
|
||||||
(byte[]) plots#8
|
|
||||||
(byte[]) plots#9
|
|
||||||
|
|
||||||
Culled Empty Block (label) line::@7
|
Culled Empty Block (label) line::@7
|
||||||
Culled Empty Block (label) @4
|
Culled Empty Block (label) @4
|
||||||
Succesful SSA optimization Pass2CullEmptyBlocks
|
Succesful SSA optimization Pass2CullEmptyBlocks
|
||||||
CONTROL FLOW GRAPH
|
CONTROL FLOW GRAPH
|
||||||
@begin: scope:[] from
|
|
||||||
(byte[]) plots#0 ← ((byte*)) (word/signed word) 4096
|
|
||||||
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
|
|
||||||
to:@3
|
|
||||||
main: scope:[main] from @3
|
|
||||||
(byte*) SCREEN#3 ← phi( @3/(byte*) SCREEN#6 )
|
|
||||||
(byte[]) plots#3 ← phi( @3/(byte[]) plots#6 )
|
|
||||||
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
|
||||||
to:main::@1
|
|
||||||
main::@1: scope:[main] from main main::@1
|
|
||||||
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#3 main::@1/(byte*) SCREEN#1 )
|
|
||||||
(byte[]) plots#1 ← phi( main/(byte[]) plots#3 main::@1/(byte[]) plots#1 )
|
|
||||||
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
|
||||||
*((byte[]) plots#1 + (byte) main::i#2) ← (byte) main::i#2
|
|
||||||
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte/signed byte/word/signed word) 0
|
|
||||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
|
||||||
(boolean~) main::$0 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
|
|
||||||
if((boolean~) main::$0) goto main::@1
|
|
||||||
to:main::@2
|
|
||||||
main::@2: scope:[main] from main::@1 main::@5
|
|
||||||
(byte*) SCREEN#10 ← phi( main::@1/(byte*) SCREEN#1 main::@5/(byte*) SCREEN#11 )
|
|
||||||
(byte[]) plots#10 ← phi( main::@1/(byte[]) plots#1 main::@5/(byte[]) plots#11 )
|
|
||||||
(byte) line::x0#0 ← (byte/signed byte/word/signed word) 0
|
|
||||||
(byte) line::x1#0 ← (byte/signed byte/word/signed word) 10
|
|
||||||
call line param-assignment
|
|
||||||
to:main::@5
|
|
||||||
main::@5: scope:[main] from main::@2
|
|
||||||
(byte*) SCREEN#11 ← phi( main::@2/(byte*) SCREEN#10 )
|
|
||||||
(byte[]) plots#11 ← phi( main::@2/(byte[]) plots#10 )
|
|
||||||
if(true) goto main::@2
|
|
||||||
to:main::@return
|
|
||||||
main::@return: scope:[main] from main::@5
|
|
||||||
return
|
|
||||||
to:@return
|
|
||||||
line: scope:[line] from main::@2
|
|
||||||
(byte*) SCREEN#7 ← phi( main::@2/(byte*) SCREEN#10 )
|
|
||||||
(byte[]) plots#7 ← phi( main::@2/(byte[]) plots#10 )
|
|
||||||
(byte) line::x1#1 ← phi( main::@2/(byte) line::x1#0 )
|
|
||||||
(byte) line::x0#1 ← phi( main::@2/(byte) line::x0#0 )
|
|
||||||
(boolean~) line::$0 ← (byte) line::x0#1 < (byte) line::x1#1
|
|
||||||
(boolean~) line::$1 ← ! (boolean~) line::$0
|
|
||||||
if((boolean~) line::$1) goto line::@1
|
|
||||||
to:line::@4
|
|
||||||
line::@1: scope:[line] from line
|
|
||||||
(byte*) SCREEN#4 ← phi( line/(byte*) SCREEN#7 )
|
|
||||||
(byte[]) plots#4 ← phi( line/(byte[]) plots#7 )
|
|
||||||
(byte) line::x0#2 ← phi( line/(byte) line::x0#1 )
|
|
||||||
(byte) plot::x#0 ← (byte) line::x0#2
|
|
||||||
call plot param-assignment
|
|
||||||
to:line::@return
|
|
||||||
line::@4: scope:[line] from line
|
|
||||||
(byte*) SCREEN#8 ← phi( line/(byte*) SCREEN#7 )
|
|
||||||
(byte[]) plots#8 ← phi( line/(byte[]) plots#7 )
|
|
||||||
(byte) line::x1#4 ← phi( line/(byte) line::x1#1 )
|
|
||||||
(byte) line::x0#3 ← phi( line/(byte) line::x0#1 )
|
|
||||||
(byte) line::x#0 ← (byte) line::x0#3
|
|
||||||
to:line::@2
|
|
||||||
line::@2: scope:[line] from line::@4 line::@8
|
|
||||||
(byte*) SCREEN#5 ← phi( line::@4/(byte*) SCREEN#8 line::@8/(byte*) SCREEN#9 )
|
|
||||||
(byte[]) plots#5 ← phi( line::@4/(byte[]) plots#8 line::@8/(byte[]) plots#9 )
|
|
||||||
(byte) line::x1#3 ← phi( line::@4/(byte) line::x1#4 line::@8/(byte) line::x1#2 )
|
|
||||||
(byte) line::x#2 ← phi( line::@4/(byte) line::x#0 line::@8/(byte) line::x#1 )
|
|
||||||
(byte) plot::x#1 ← (byte) line::x#2
|
|
||||||
call plot param-assignment
|
|
||||||
to:line::@8
|
|
||||||
line::@8: scope:[line] from line::@2
|
|
||||||
(byte*) SCREEN#9 ← phi( line::@2/(byte*) SCREEN#5 )
|
|
||||||
(byte[]) plots#9 ← phi( line::@2/(byte[]) plots#5 )
|
|
||||||
(byte) line::x1#2 ← phi( line::@2/(byte) line::x1#3 )
|
|
||||||
(byte) line::x#3 ← phi( line::@2/(byte) line::x#2 )
|
|
||||||
(byte) line::x#1 ← ++ (byte) line::x#3
|
|
||||||
(boolean~) line::$3 ← (byte) line::x#1 <= (byte) line::x1#2
|
|
||||||
if((boolean~) line::$3) goto line::@2
|
|
||||||
to:line::@return
|
|
||||||
line::@return: scope:[line] from line::@1 line::@8
|
|
||||||
return
|
|
||||||
to:@return
|
|
||||||
plot: scope:[plot] from line::@1 line::@2
|
|
||||||
(byte*) SCREEN#2 ← phi( line::@1/(byte*) SCREEN#4 line::@2/(byte*) SCREEN#5 )
|
|
||||||
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
|
|
||||||
(byte[]) plots#2 ← phi( line::@1/(byte[]) plots#4 line::@2/(byte[]) plots#5 )
|
|
||||||
(byte~) plot::$0 ← (byte[]) plots#2 *idx (byte) plot::x#2
|
|
||||||
(byte) plot::idx#0 ← (byte~) plot::$0
|
|
||||||
(byte~) plot::$1 ← (byte*) SCREEN#2 *idx (byte) plot::idx#0
|
|
||||||
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
|
|
||||||
*((byte*) SCREEN#2 + (byte) plot::idx#0) ← (byte~) plot::$2
|
|
||||||
to:plot::@return
|
|
||||||
plot::@return: scope:[plot] from plot
|
|
||||||
return
|
|
||||||
to:@return
|
|
||||||
@3: scope:[] from @begin
|
|
||||||
(byte*) SCREEN#6 ← phi( @begin/(byte*) SCREEN#0 )
|
|
||||||
(byte[]) plots#6 ← phi( @begin/(byte[]) plots#0 )
|
|
||||||
call main param-assignment
|
|
||||||
to:@end
|
|
||||||
@end: scope:[] from @3
|
|
||||||
|
|
||||||
Inversing boolean not (boolean~) line::$1 ← (byte) line::x0#1 >= (byte) line::x1#1 from (boolean~) line::$0 ← (byte) line::x0#1 < (byte) line::x1#1
|
|
||||||
Succesful SSA optimization Pass2UnaryNotSimplification
|
|
||||||
CONTROL FLOW GRAPH
|
|
||||||
@begin: scope:[] from
|
|
||||||
(byte[]) plots#0 ← ((byte*)) (word/signed word) 4096
|
|
||||||
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
|
|
||||||
to:@3
|
|
||||||
main: scope:[main] from @3
|
|
||||||
(byte*) SCREEN#3 ← phi( @3/(byte*) SCREEN#6 )
|
|
||||||
(byte[]) plots#3 ← phi( @3/(byte[]) plots#6 )
|
|
||||||
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
|
||||||
to:main::@1
|
|
||||||
main::@1: scope:[main] from main main::@1
|
|
||||||
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#3 main::@1/(byte*) SCREEN#1 )
|
|
||||||
(byte[]) plots#1 ← phi( main/(byte[]) plots#3 main::@1/(byte[]) plots#1 )
|
|
||||||
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
|
||||||
*((byte[]) plots#1 + (byte) main::i#2) ← (byte) main::i#2
|
|
||||||
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte/signed byte/word/signed word) 0
|
|
||||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
|
||||||
(boolean~) main::$0 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
|
|
||||||
if((boolean~) main::$0) goto main::@1
|
|
||||||
to:main::@2
|
|
||||||
main::@2: scope:[main] from main::@1 main::@5
|
|
||||||
(byte*) SCREEN#10 ← phi( main::@1/(byte*) SCREEN#1 main::@5/(byte*) SCREEN#11 )
|
|
||||||
(byte[]) plots#10 ← phi( main::@1/(byte[]) plots#1 main::@5/(byte[]) plots#11 )
|
|
||||||
(byte) line::x0#0 ← (byte/signed byte/word/signed word) 0
|
|
||||||
(byte) line::x1#0 ← (byte/signed byte/word/signed word) 10
|
|
||||||
call line param-assignment
|
|
||||||
to:main::@5
|
|
||||||
main::@5: scope:[main] from main::@2
|
|
||||||
(byte*) SCREEN#11 ← phi( main::@2/(byte*) SCREEN#10 )
|
|
||||||
(byte[]) plots#11 ← phi( main::@2/(byte[]) plots#10 )
|
|
||||||
if(true) goto main::@2
|
|
||||||
to:main::@return
|
|
||||||
main::@return: scope:[main] from main::@5
|
|
||||||
return
|
|
||||||
to:@return
|
|
||||||
line: scope:[line] from main::@2
|
|
||||||
(byte*) SCREEN#7 ← phi( main::@2/(byte*) SCREEN#10 )
|
|
||||||
(byte[]) plots#7 ← phi( main::@2/(byte[]) plots#10 )
|
|
||||||
(byte) line::x1#1 ← phi( main::@2/(byte) line::x1#0 )
|
|
||||||
(byte) line::x0#1 ← phi( main::@2/(byte) line::x0#0 )
|
|
||||||
(boolean~) line::$1 ← (byte) line::x0#1 >= (byte) line::x1#1
|
|
||||||
if((boolean~) line::$1) goto line::@1
|
|
||||||
to:line::@4
|
|
||||||
line::@1: scope:[line] from line
|
|
||||||
(byte*) SCREEN#4 ← phi( line/(byte*) SCREEN#7 )
|
|
||||||
(byte[]) plots#4 ← phi( line/(byte[]) plots#7 )
|
|
||||||
(byte) line::x0#2 ← phi( line/(byte) line::x0#1 )
|
|
||||||
(byte) plot::x#0 ← (byte) line::x0#2
|
|
||||||
call plot param-assignment
|
|
||||||
to:line::@return
|
|
||||||
line::@4: scope:[line] from line
|
|
||||||
(byte*) SCREEN#8 ← phi( line/(byte*) SCREEN#7 )
|
|
||||||
(byte[]) plots#8 ← phi( line/(byte[]) plots#7 )
|
|
||||||
(byte) line::x1#4 ← phi( line/(byte) line::x1#1 )
|
|
||||||
(byte) line::x0#3 ← phi( line/(byte) line::x0#1 )
|
|
||||||
(byte) line::x#0 ← (byte) line::x0#3
|
|
||||||
to:line::@2
|
|
||||||
line::@2: scope:[line] from line::@4 line::@8
|
|
||||||
(byte*) SCREEN#5 ← phi( line::@4/(byte*) SCREEN#8 line::@8/(byte*) SCREEN#9 )
|
|
||||||
(byte[]) plots#5 ← phi( line::@4/(byte[]) plots#8 line::@8/(byte[]) plots#9 )
|
|
||||||
(byte) line::x1#3 ← phi( line::@4/(byte) line::x1#4 line::@8/(byte) line::x1#2 )
|
|
||||||
(byte) line::x#2 ← phi( line::@4/(byte) line::x#0 line::@8/(byte) line::x#1 )
|
|
||||||
(byte) plot::x#1 ← (byte) line::x#2
|
|
||||||
call plot param-assignment
|
|
||||||
to:line::@8
|
|
||||||
line::@8: scope:[line] from line::@2
|
|
||||||
(byte*) SCREEN#9 ← phi( line::@2/(byte*) SCREEN#5 )
|
|
||||||
(byte[]) plots#9 ← phi( line::@2/(byte[]) plots#5 )
|
|
||||||
(byte) line::x1#2 ← phi( line::@2/(byte) line::x1#3 )
|
|
||||||
(byte) line::x#3 ← phi( line::@2/(byte) line::x#2 )
|
|
||||||
(byte) line::x#1 ← ++ (byte) line::x#3
|
|
||||||
(boolean~) line::$3 ← (byte) line::x#1 <= (byte) line::x1#2
|
|
||||||
if((boolean~) line::$3) goto line::@2
|
|
||||||
to:line::@return
|
|
||||||
line::@return: scope:[line] from line::@1 line::@8
|
|
||||||
return
|
|
||||||
to:@return
|
|
||||||
plot: scope:[plot] from line::@1 line::@2
|
|
||||||
(byte*) SCREEN#2 ← phi( line::@1/(byte*) SCREEN#4 line::@2/(byte*) SCREEN#5 )
|
|
||||||
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
|
|
||||||
(byte[]) plots#2 ← phi( line::@1/(byte[]) plots#4 line::@2/(byte[]) plots#5 )
|
|
||||||
(byte~) plot::$0 ← (byte[]) plots#2 *idx (byte) plot::x#2
|
|
||||||
(byte) plot::idx#0 ← (byte~) plot::$0
|
|
||||||
(byte~) plot::$1 ← (byte*) SCREEN#2 *idx (byte) plot::idx#0
|
|
||||||
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
|
|
||||||
*((byte*) SCREEN#2 + (byte) plot::idx#0) ← (byte~) plot::$2
|
|
||||||
to:plot::@return
|
|
||||||
plot::@return: scope:[plot] from plot
|
|
||||||
return
|
|
||||||
to:@return
|
|
||||||
@3: scope:[] from @begin
|
|
||||||
(byte*) SCREEN#6 ← phi( @begin/(byte*) SCREEN#0 )
|
|
||||||
(byte[]) plots#6 ← phi( @begin/(byte[]) plots#0 )
|
|
||||||
call main param-assignment
|
|
||||||
to:@end
|
|
||||||
@end: scope:[] from @3
|
|
||||||
|
|
||||||
Not aliassing across scopes: plots#3 plots#6
|
|
||||||
Not aliassing across scopes: SCREEN#3 SCREEN#6
|
|
||||||
Not aliassing across scopes: line::x0#1 line::x0#0
|
|
||||||
Not aliassing across scopes: line::x1#1 line::x1#0
|
|
||||||
Not aliassing across scopes: plots#7 plots#10
|
|
||||||
Not aliassing across scopes: SCREEN#7 SCREEN#10
|
|
||||||
Not aliassing across scopes: plot::x#0 line::x0#2
|
|
||||||
Not aliassing across scopes: plot::x#1 line::x#2
|
|
||||||
Not aliassing across scopes: plots#2 plots#4
|
|
||||||
Not aliassing across scopes: plot::x#2 plot::x#0
|
|
||||||
Not aliassing across scopes: SCREEN#2 SCREEN#4
|
|
||||||
Alias (byte[]) plots#10 = (byte[]) plots#11
|
|
||||||
Alias (byte*) SCREEN#10 = (byte*) SCREEN#11
|
|
||||||
Alias (byte) line::x#0 = (byte) line::x0#2 (byte) line::x0#1 (byte) line::x0#3
|
|
||||||
Alias (byte[]) plots#4 = (byte[]) plots#7 (byte[]) plots#8
|
|
||||||
Alias (byte*) SCREEN#4 = (byte*) SCREEN#7 (byte*) SCREEN#8
|
|
||||||
Alias (byte) line::x1#1 = (byte) line::x1#4
|
|
||||||
Alias (byte) line::x#2 = (byte) line::x#3
|
|
||||||
Alias (byte) line::x1#2 = (byte) line::x1#3
|
|
||||||
Alias (byte[]) plots#5 = (byte[]) plots#9
|
|
||||||
Alias (byte*) SCREEN#5 = (byte*) SCREEN#9
|
|
||||||
Alias (byte) plot::idx#0 = (byte~) plot::$0
|
|
||||||
Alias (byte[]) plots#0 = (byte[]) plots#6
|
|
||||||
Alias (byte*) SCREEN#0 = (byte*) SCREEN#6
|
|
||||||
Succesful SSA optimization Pass2AliasElimination
|
|
||||||
CONTROL FLOW GRAPH
|
|
||||||
@begin: scope:[] from
|
|
||||||
(byte[]) plots#0 ← ((byte*)) (word/signed word) 4096
|
|
||||||
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
|
|
||||||
to:@3
|
|
||||||
main: scope:[main] from @3
|
|
||||||
(byte*) SCREEN#3 ← phi( @3/(byte*) SCREEN#0 )
|
|
||||||
(byte[]) plots#3 ← phi( @3/(byte[]) plots#0 )
|
|
||||||
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
|
||||||
to:main::@1
|
|
||||||
main::@1: scope:[main] from main main::@1
|
|
||||||
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#3 main::@1/(byte*) SCREEN#1 )
|
|
||||||
(byte[]) plots#1 ← phi( main/(byte[]) plots#3 main::@1/(byte[]) plots#1 )
|
|
||||||
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
|
||||||
*((byte[]) plots#1 + (byte) main::i#2) ← (byte) main::i#2
|
|
||||||
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte/signed byte/word/signed word) 0
|
|
||||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
|
||||||
(boolean~) main::$0 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
|
|
||||||
if((boolean~) main::$0) goto main::@1
|
|
||||||
to:main::@2
|
|
||||||
main::@2: scope:[main] from main::@1 main::@5
|
|
||||||
(byte*) SCREEN#10 ← phi( main::@1/(byte*) SCREEN#1 main::@5/(byte*) SCREEN#10 )
|
|
||||||
(byte[]) plots#10 ← phi( main::@1/(byte[]) plots#1 main::@5/(byte[]) plots#10 )
|
|
||||||
(byte) line::x0#0 ← (byte/signed byte/word/signed word) 0
|
|
||||||
(byte) line::x1#0 ← (byte/signed byte/word/signed word) 10
|
|
||||||
call line param-assignment
|
|
||||||
to:main::@5
|
|
||||||
main::@5: scope:[main] from main::@2
|
|
||||||
if(true) goto main::@2
|
|
||||||
to:main::@return
|
|
||||||
main::@return: scope:[main] from main::@5
|
|
||||||
return
|
|
||||||
to:@return
|
|
||||||
line: scope:[line] from main::@2
|
|
||||||
(byte*) SCREEN#4 ← phi( main::@2/(byte*) SCREEN#10 )
|
|
||||||
(byte[]) plots#4 ← phi( main::@2/(byte[]) plots#10 )
|
|
||||||
(byte) line::x1#1 ← phi( main::@2/(byte) line::x1#0 )
|
|
||||||
(byte) line::x#0 ← phi( main::@2/(byte) line::x0#0 )
|
|
||||||
(boolean~) line::$1 ← (byte) line::x#0 >= (byte) line::x1#1
|
|
||||||
if((boolean~) line::$1) goto line::@1
|
|
||||||
to:line::@4
|
|
||||||
line::@1: scope:[line] from line
|
|
||||||
(byte) plot::x#0 ← (byte) line::x#0
|
|
||||||
call plot param-assignment
|
|
||||||
to:line::@return
|
|
||||||
line::@4: scope:[line] from line
|
|
||||||
to:line::@2
|
|
||||||
line::@2: scope:[line] from line::@4 line::@8
|
|
||||||
(byte*) SCREEN#5 ← phi( line::@4/(byte*) SCREEN#4 line::@8/(byte*) SCREEN#5 )
|
|
||||||
(byte[]) plots#5 ← phi( line::@4/(byte[]) plots#4 line::@8/(byte[]) plots#5 )
|
|
||||||
(byte) line::x1#2 ← phi( line::@4/(byte) line::x1#1 line::@8/(byte) line::x1#2 )
|
|
||||||
(byte) line::x#2 ← phi( line::@4/(byte) line::x#0 line::@8/(byte) line::x#1 )
|
|
||||||
(byte) plot::x#1 ← (byte) line::x#2
|
|
||||||
call plot param-assignment
|
|
||||||
to:line::@8
|
|
||||||
line::@8: scope:[line] from line::@2
|
|
||||||
(byte) line::x#1 ← ++ (byte) line::x#2
|
|
||||||
(boolean~) line::$3 ← (byte) line::x#1 <= (byte) line::x1#2
|
|
||||||
if((boolean~) line::$3) goto line::@2
|
|
||||||
to:line::@return
|
|
||||||
line::@return: scope:[line] from line::@1 line::@8
|
|
||||||
return
|
|
||||||
to:@return
|
|
||||||
plot: scope:[plot] from line::@1 line::@2
|
|
||||||
(byte*) SCREEN#2 ← phi( line::@1/(byte*) SCREEN#4 line::@2/(byte*) SCREEN#5 )
|
|
||||||
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
|
|
||||||
(byte[]) plots#2 ← phi( line::@1/(byte[]) plots#4 line::@2/(byte[]) plots#5 )
|
|
||||||
(byte) plot::idx#0 ← (byte[]) plots#2 *idx (byte) plot::x#2
|
|
||||||
(byte~) plot::$1 ← (byte*) SCREEN#2 *idx (byte) plot::idx#0
|
|
||||||
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
|
|
||||||
*((byte*) SCREEN#2 + (byte) plot::idx#0) ← (byte~) plot::$2
|
|
||||||
to:plot::@return
|
|
||||||
plot::@return: scope:[plot] from plot
|
|
||||||
return
|
|
||||||
to:@return
|
|
||||||
@3: scope:[] from @begin
|
|
||||||
call main param-assignment
|
|
||||||
to:@end
|
|
||||||
@end: scope:[] from @3
|
|
||||||
|
|
||||||
Not aliassing across scopes: plots#3 plots#0
|
|
||||||
Not aliassing across scopes: SCREEN#3 SCREEN#0
|
|
||||||
Not aliassing across scopes: line::x#0 line::x0#0
|
|
||||||
Not aliassing across scopes: line::x1#1 line::x1#0
|
|
||||||
Not aliassing across scopes: plots#4 plots#10
|
|
||||||
Not aliassing across scopes: SCREEN#4 SCREEN#10
|
|
||||||
Not aliassing across scopes: plot::x#0 line::x#0
|
|
||||||
Not aliassing across scopes: plot::x#1 line::x#2
|
|
||||||
Not aliassing across scopes: plots#2 plots#4
|
|
||||||
Not aliassing across scopes: plot::x#2 plot::x#0
|
|
||||||
Not aliassing across scopes: SCREEN#2 SCREEN#4
|
|
||||||
Self Phi Eliminated (byte[]) plots#1
|
|
||||||
Self Phi Eliminated (byte*) SCREEN#1
|
|
||||||
Self Phi Eliminated (byte[]) plots#10
|
|
||||||
Self Phi Eliminated (byte*) SCREEN#10
|
|
||||||
Self Phi Eliminated (byte) line::x1#2
|
|
||||||
Self Phi Eliminated (byte[]) plots#5
|
|
||||||
Self Phi Eliminated (byte*) SCREEN#5
|
|
||||||
Succesful SSA optimization Pass2SelfPhiElimination
|
|
||||||
CONTROL FLOW GRAPH
|
|
||||||
@begin: scope:[] from
|
|
||||||
(byte[]) plots#0 ← ((byte*)) (word/signed word) 4096
|
|
||||||
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
|
|
||||||
to:@3
|
|
||||||
main: scope:[main] from @3
|
|
||||||
(byte*) SCREEN#3 ← phi( @3/(byte*) SCREEN#0 )
|
|
||||||
(byte[]) plots#3 ← phi( @3/(byte[]) plots#0 )
|
|
||||||
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
|
||||||
to:main::@1
|
|
||||||
main::@1: scope:[main] from main main::@1
|
|
||||||
(byte*) SCREEN#1 ← phi( main/(byte*) SCREEN#3 )
|
|
||||||
(byte[]) plots#1 ← phi( main/(byte[]) plots#3 )
|
|
||||||
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
|
||||||
*((byte[]) plots#1 + (byte) main::i#2) ← (byte) main::i#2
|
|
||||||
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte/signed byte/word/signed word) 0
|
|
||||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
|
||||||
(boolean~) main::$0 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
|
|
||||||
if((boolean~) main::$0) goto main::@1
|
|
||||||
to:main::@2
|
|
||||||
main::@2: scope:[main] from main::@1 main::@5
|
|
||||||
(byte*) SCREEN#10 ← phi( main::@1/(byte*) SCREEN#1 )
|
|
||||||
(byte[]) plots#10 ← phi( main::@1/(byte[]) plots#1 )
|
|
||||||
(byte) line::x0#0 ← (byte/signed byte/word/signed word) 0
|
|
||||||
(byte) line::x1#0 ← (byte/signed byte/word/signed word) 10
|
|
||||||
call line param-assignment
|
|
||||||
to:main::@5
|
|
||||||
main::@5: scope:[main] from main::@2
|
|
||||||
if(true) goto main::@2
|
|
||||||
to:main::@return
|
|
||||||
main::@return: scope:[main] from main::@5
|
|
||||||
return
|
|
||||||
to:@return
|
|
||||||
line: scope:[line] from main::@2
|
|
||||||
(byte*) SCREEN#4 ← phi( main::@2/(byte*) SCREEN#10 )
|
|
||||||
(byte[]) plots#4 ← phi( main::@2/(byte[]) plots#10 )
|
|
||||||
(byte) line::x1#1 ← phi( main::@2/(byte) line::x1#0 )
|
|
||||||
(byte) line::x#0 ← phi( main::@2/(byte) line::x0#0 )
|
|
||||||
(boolean~) line::$1 ← (byte) line::x#0 >= (byte) line::x1#1
|
|
||||||
if((boolean~) line::$1) goto line::@1
|
|
||||||
to:line::@4
|
|
||||||
line::@1: scope:[line] from line
|
|
||||||
(byte) plot::x#0 ← (byte) line::x#0
|
|
||||||
call plot param-assignment
|
|
||||||
to:line::@return
|
|
||||||
line::@4: scope:[line] from line
|
|
||||||
to:line::@2
|
|
||||||
line::@2: scope:[line] from line::@4 line::@8
|
|
||||||
(byte*) SCREEN#5 ← phi( line::@4/(byte*) SCREEN#4 )
|
|
||||||
(byte[]) plots#5 ← phi( line::@4/(byte[]) plots#4 )
|
|
||||||
(byte) line::x1#2 ← phi( line::@4/(byte) line::x1#1 )
|
|
||||||
(byte) line::x#2 ← phi( line::@4/(byte) line::x#0 line::@8/(byte) line::x#1 )
|
|
||||||
(byte) plot::x#1 ← (byte) line::x#2
|
|
||||||
call plot param-assignment
|
|
||||||
to:line::@8
|
|
||||||
line::@8: scope:[line] from line::@2
|
|
||||||
(byte) line::x#1 ← ++ (byte) line::x#2
|
|
||||||
(boolean~) line::$3 ← (byte) line::x#1 <= (byte) line::x1#2
|
|
||||||
if((boolean~) line::$3) goto line::@2
|
|
||||||
to:line::@return
|
|
||||||
line::@return: scope:[line] from line::@1 line::@8
|
|
||||||
return
|
|
||||||
to:@return
|
|
||||||
plot: scope:[plot] from line::@1 line::@2
|
|
||||||
(byte*) SCREEN#2 ← phi( line::@1/(byte*) SCREEN#4 line::@2/(byte*) SCREEN#5 )
|
|
||||||
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
|
|
||||||
(byte[]) plots#2 ← phi( line::@1/(byte[]) plots#4 line::@2/(byte[]) plots#5 )
|
|
||||||
(byte) plot::idx#0 ← (byte[]) plots#2 *idx (byte) plot::x#2
|
|
||||||
(byte~) plot::$1 ← (byte*) SCREEN#2 *idx (byte) plot::idx#0
|
|
||||||
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
|
|
||||||
*((byte*) SCREEN#2 + (byte) plot::idx#0) ← (byte~) plot::$2
|
|
||||||
to:plot::@return
|
|
||||||
plot::@return: scope:[plot] from plot
|
|
||||||
return
|
|
||||||
to:@return
|
|
||||||
@3: scope:[] from @begin
|
|
||||||
call main param-assignment
|
|
||||||
to:@end
|
|
||||||
@end: scope:[] from @3
|
|
||||||
|
|
||||||
Redundant Phi (byte[]) plots#3 (byte[]) plots#0
|
|
||||||
Redundant Phi (byte*) SCREEN#3 (byte*) SCREEN#0
|
|
||||||
Redundant Phi (byte[]) plots#1 (byte[]) plots#3
|
|
||||||
Redundant Phi (byte*) SCREEN#1 (byte*) SCREEN#3
|
|
||||||
Redundant Phi (byte[]) plots#10 (byte[]) plots#1
|
|
||||||
Redundant Phi (byte*) SCREEN#10 (byte*) SCREEN#1
|
|
||||||
Redundant Phi (byte) line::x#0 (byte) line::x0#0
|
|
||||||
Redundant Phi (byte) line::x1#1 (byte) line::x1#0
|
|
||||||
Redundant Phi (byte[]) plots#4 (byte[]) plots#10
|
|
||||||
Redundant Phi (byte*) SCREEN#4 (byte*) SCREEN#10
|
|
||||||
Redundant Phi (byte) line::x1#2 (byte) line::x1#1
|
|
||||||
Redundant Phi (byte[]) plots#5 (byte[]) plots#4
|
|
||||||
Redundant Phi (byte*) SCREEN#5 (byte*) SCREEN#4
|
|
||||||
Succesful SSA optimization Pass2RedundantPhiElimination
|
|
||||||
CONTROL FLOW GRAPH
|
|
||||||
@begin: scope:[] from
|
@begin: scope:[] from
|
||||||
(byte[]) plots#0 ← ((byte*)) (word/signed word) 4096
|
(byte[]) plots#0 ← ((byte*)) (word/signed word) 4096
|
||||||
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
|
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
|
||||||
@ -1048,36 +565,45 @@ main::@return: scope:[main] from main::@5
|
|||||||
return
|
return
|
||||||
to:@return
|
to:@return
|
||||||
line: scope:[line] from main::@2
|
line: scope:[line] from main::@2
|
||||||
(boolean~) line::$1 ← (byte) line::x0#0 >= (byte) line::x1#0
|
(byte) line::x1#1 ← phi( main::@2/(byte) line::x1#0 )
|
||||||
|
(byte) line::x0#1 ← phi( main::@2/(byte) line::x0#0 )
|
||||||
|
(boolean~) line::$0 ← (byte) line::x0#1 < (byte) line::x1#1
|
||||||
|
(boolean~) line::$1 ← ! (boolean~) line::$0
|
||||||
if((boolean~) line::$1) goto line::@1
|
if((boolean~) line::$1) goto line::@1
|
||||||
to:line::@4
|
to:line::@4
|
||||||
line::@1: scope:[line] from line
|
line::@1: scope:[line] from line
|
||||||
(byte) plot::x#0 ← (byte) line::x0#0
|
(byte) line::x0#2 ← phi( line/(byte) line::x0#1 )
|
||||||
|
(byte) plot::x#0 ← (byte) line::x0#2
|
||||||
call plot param-assignment
|
call plot param-assignment
|
||||||
to:line::@return
|
to:line::@return
|
||||||
line::@4: scope:[line] from line
|
line::@4: scope:[line] from line
|
||||||
|
(byte) line::x1#4 ← phi( line/(byte) line::x1#1 )
|
||||||
|
(byte) line::x0#3 ← phi( line/(byte) line::x0#1 )
|
||||||
|
(byte) line::x#0 ← (byte) line::x0#3
|
||||||
to:line::@2
|
to:line::@2
|
||||||
line::@2: scope:[line] from line::@4 line::@8
|
line::@2: scope:[line] from line::@4 line::@8
|
||||||
(byte) line::x#2 ← phi( line::@4/(byte) line::x0#0 line::@8/(byte) line::x#1 )
|
(byte) line::x1#3 ← phi( line::@4/(byte) line::x1#4 line::@8/(byte) line::x1#2 )
|
||||||
|
(byte) line::x#2 ← phi( line::@4/(byte) line::x#0 line::@8/(byte) line::x#1 )
|
||||||
(byte) plot::x#1 ← (byte) line::x#2
|
(byte) plot::x#1 ← (byte) line::x#2
|
||||||
call plot param-assignment
|
call plot param-assignment
|
||||||
to:line::@8
|
to:line::@8
|
||||||
line::@8: scope:[line] from line::@2
|
line::@8: scope:[line] from line::@2
|
||||||
(byte) line::x#1 ← ++ (byte) line::x#2
|
(byte) line::x1#2 ← phi( line::@2/(byte) line::x1#3 )
|
||||||
(boolean~) line::$3 ← (byte) line::x#1 <= (byte) line::x1#0
|
(byte) line::x#3 ← phi( line::@2/(byte) line::x#2 )
|
||||||
|
(byte) line::x#1 ← ++ (byte) line::x#3
|
||||||
|
(boolean~) line::$3 ← (byte) line::x#1 <= (byte) line::x1#2
|
||||||
if((boolean~) line::$3) goto line::@2
|
if((boolean~) line::$3) goto line::@2
|
||||||
to:line::@return
|
to:line::@return
|
||||||
line::@return: scope:[line] from line::@1 line::@8
|
line::@return: scope:[line] from line::@1 line::@8
|
||||||
return
|
return
|
||||||
to:@return
|
to:@return
|
||||||
plot: scope:[plot] from line::@1 line::@2
|
plot: scope:[plot] from line::@1 line::@2
|
||||||
(byte*) SCREEN#2 ← phi( line::@1/(byte*) SCREEN#0 line::@2/(byte*) SCREEN#0 )
|
|
||||||
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
|
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
|
||||||
(byte[]) plots#2 ← phi( line::@1/(byte[]) plots#0 line::@2/(byte[]) plots#0 )
|
(byte~) plot::$0 ← (byte[]) plots#0 *idx (byte) plot::x#2
|
||||||
(byte) plot::idx#0 ← (byte[]) plots#2 *idx (byte) plot::x#2
|
(byte) plot::idx#0 ← (byte~) plot::$0
|
||||||
(byte~) plot::$1 ← (byte*) SCREEN#2 *idx (byte) plot::idx#0
|
(byte~) plot::$1 ← (byte*) SCREEN#0 *idx (byte) plot::idx#0
|
||||||
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
|
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
|
||||||
*((byte*) SCREEN#2 + (byte) plot::idx#0) ← (byte~) plot::$2
|
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2
|
||||||
to:plot::@return
|
to:plot::@return
|
||||||
plot::@return: scope:[plot] from plot
|
plot::@return: scope:[plot] from plot
|
||||||
return
|
return
|
||||||
@ -1087,8 +613,240 @@ plot::@return: scope:[plot] from plot
|
|||||||
to:@end
|
to:@end
|
||||||
@end: scope:[] from @3
|
@end: scope:[] from @3
|
||||||
|
|
||||||
Redundant Phi (byte[]) plots#2 (byte[]) plots#0
|
Inversing boolean not (boolean~) line::$1 ← (byte) line::x0#1 >= (byte) line::x1#1 from (boolean~) line::$0 ← (byte) line::x0#1 < (byte) line::x1#1
|
||||||
Redundant Phi (byte*) SCREEN#2 (byte*) SCREEN#0
|
Succesful SSA optimization Pass2UnaryNotSimplification
|
||||||
|
CONTROL FLOW GRAPH
|
||||||
|
@begin: scope:[] from
|
||||||
|
(byte[]) plots#0 ← ((byte*)) (word/signed word) 4096
|
||||||
|
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
|
||||||
|
to:@3
|
||||||
|
main: scope:[main] from @3
|
||||||
|
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
||||||
|
to:main::@1
|
||||||
|
main::@1: scope:[main] from main main::@1
|
||||||
|
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||||
|
*((byte[]) plots#0 + (byte) main::i#2) ← (byte) main::i#2
|
||||||
|
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte/signed byte/word/signed word) 0
|
||||||
|
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||||
|
(boolean~) main::$0 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
|
||||||
|
if((boolean~) main::$0) goto main::@1
|
||||||
|
to:main::@2
|
||||||
|
main::@2: scope:[main] from main::@1 main::@5
|
||||||
|
(byte) line::x0#0 ← (byte/signed byte/word/signed word) 0
|
||||||
|
(byte) line::x1#0 ← (byte/signed byte/word/signed word) 10
|
||||||
|
call line param-assignment
|
||||||
|
to:main::@5
|
||||||
|
main::@5: scope:[main] from main::@2
|
||||||
|
if(true) goto main::@2
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main::@5
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
line: scope:[line] from main::@2
|
||||||
|
(byte) line::x1#1 ← phi( main::@2/(byte) line::x1#0 )
|
||||||
|
(byte) line::x0#1 ← phi( main::@2/(byte) line::x0#0 )
|
||||||
|
(boolean~) line::$1 ← (byte) line::x0#1 >= (byte) line::x1#1
|
||||||
|
if((boolean~) line::$1) goto line::@1
|
||||||
|
to:line::@4
|
||||||
|
line::@1: scope:[line] from line
|
||||||
|
(byte) line::x0#2 ← phi( line/(byte) line::x0#1 )
|
||||||
|
(byte) plot::x#0 ← (byte) line::x0#2
|
||||||
|
call plot param-assignment
|
||||||
|
to:line::@return
|
||||||
|
line::@4: scope:[line] from line
|
||||||
|
(byte) line::x1#4 ← phi( line/(byte) line::x1#1 )
|
||||||
|
(byte) line::x0#3 ← phi( line/(byte) line::x0#1 )
|
||||||
|
(byte) line::x#0 ← (byte) line::x0#3
|
||||||
|
to:line::@2
|
||||||
|
line::@2: scope:[line] from line::@4 line::@8
|
||||||
|
(byte) line::x1#3 ← phi( line::@4/(byte) line::x1#4 line::@8/(byte) line::x1#2 )
|
||||||
|
(byte) line::x#2 ← phi( line::@4/(byte) line::x#0 line::@8/(byte) line::x#1 )
|
||||||
|
(byte) plot::x#1 ← (byte) line::x#2
|
||||||
|
call plot param-assignment
|
||||||
|
to:line::@8
|
||||||
|
line::@8: scope:[line] from line::@2
|
||||||
|
(byte) line::x1#2 ← phi( line::@2/(byte) line::x1#3 )
|
||||||
|
(byte) line::x#3 ← phi( line::@2/(byte) line::x#2 )
|
||||||
|
(byte) line::x#1 ← ++ (byte) line::x#3
|
||||||
|
(boolean~) line::$3 ← (byte) line::x#1 <= (byte) line::x1#2
|
||||||
|
if((boolean~) line::$3) goto line::@2
|
||||||
|
to:line::@return
|
||||||
|
line::@return: scope:[line] from line::@1 line::@8
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
plot: scope:[plot] from line::@1 line::@2
|
||||||
|
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
|
||||||
|
(byte~) plot::$0 ← (byte[]) plots#0 *idx (byte) plot::x#2
|
||||||
|
(byte) plot::idx#0 ← (byte~) plot::$0
|
||||||
|
(byte~) plot::$1 ← (byte*) SCREEN#0 *idx (byte) plot::idx#0
|
||||||
|
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
|
||||||
|
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2
|
||||||
|
to:plot::@return
|
||||||
|
plot::@return: scope:[plot] from plot
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@3: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @3
|
||||||
|
|
||||||
|
Not aliassing across scopes: line::x0#1 line::x0#0
|
||||||
|
Not aliassing across scopes: line::x1#1 line::x1#0
|
||||||
|
Not aliassing across scopes: plot::x#0 line::x0#2
|
||||||
|
Not aliassing across scopes: plot::x#1 line::x#2
|
||||||
|
Not aliassing across scopes: plot::x#2 plot::x#0
|
||||||
|
Alias (byte) line::x#0 = (byte) line::x0#2 (byte) line::x0#1 (byte) line::x0#3
|
||||||
|
Alias (byte) line::x1#1 = (byte) line::x1#4
|
||||||
|
Alias (byte) line::x#2 = (byte) line::x#3
|
||||||
|
Alias (byte) line::x1#2 = (byte) line::x1#3
|
||||||
|
Alias (byte) plot::idx#0 = (byte~) plot::$0
|
||||||
|
Succesful SSA optimization Pass2AliasElimination
|
||||||
|
CONTROL FLOW GRAPH
|
||||||
|
@begin: scope:[] from
|
||||||
|
(byte[]) plots#0 ← ((byte*)) (word/signed word) 4096
|
||||||
|
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
|
||||||
|
to:@3
|
||||||
|
main: scope:[main] from @3
|
||||||
|
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
||||||
|
to:main::@1
|
||||||
|
main::@1: scope:[main] from main main::@1
|
||||||
|
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||||
|
*((byte[]) plots#0 + (byte) main::i#2) ← (byte) main::i#2
|
||||||
|
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte/signed byte/word/signed word) 0
|
||||||
|
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||||
|
(boolean~) main::$0 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
|
||||||
|
if((boolean~) main::$0) goto main::@1
|
||||||
|
to:main::@2
|
||||||
|
main::@2: scope:[main] from main::@1 main::@5
|
||||||
|
(byte) line::x0#0 ← (byte/signed byte/word/signed word) 0
|
||||||
|
(byte) line::x1#0 ← (byte/signed byte/word/signed word) 10
|
||||||
|
call line param-assignment
|
||||||
|
to:main::@5
|
||||||
|
main::@5: scope:[main] from main::@2
|
||||||
|
if(true) goto main::@2
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main::@5
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
line: scope:[line] from main::@2
|
||||||
|
(byte) line::x1#1 ← phi( main::@2/(byte) line::x1#0 )
|
||||||
|
(byte) line::x#0 ← phi( main::@2/(byte) line::x0#0 )
|
||||||
|
(boolean~) line::$1 ← (byte) line::x#0 >= (byte) line::x1#1
|
||||||
|
if((boolean~) line::$1) goto line::@1
|
||||||
|
to:line::@4
|
||||||
|
line::@1: scope:[line] from line
|
||||||
|
(byte) plot::x#0 ← (byte) line::x#0
|
||||||
|
call plot param-assignment
|
||||||
|
to:line::@return
|
||||||
|
line::@4: scope:[line] from line
|
||||||
|
to:line::@2
|
||||||
|
line::@2: scope:[line] from line::@4 line::@8
|
||||||
|
(byte) line::x1#2 ← phi( line::@4/(byte) line::x1#1 line::@8/(byte) line::x1#2 )
|
||||||
|
(byte) line::x#2 ← phi( line::@4/(byte) line::x#0 line::@8/(byte) line::x#1 )
|
||||||
|
(byte) plot::x#1 ← (byte) line::x#2
|
||||||
|
call plot param-assignment
|
||||||
|
to:line::@8
|
||||||
|
line::@8: scope:[line] from line::@2
|
||||||
|
(byte) line::x#1 ← ++ (byte) line::x#2
|
||||||
|
(boolean~) line::$3 ← (byte) line::x#1 <= (byte) line::x1#2
|
||||||
|
if((boolean~) line::$3) goto line::@2
|
||||||
|
to:line::@return
|
||||||
|
line::@return: scope:[line] from line::@1 line::@8
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
plot: scope:[plot] from line::@1 line::@2
|
||||||
|
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
|
||||||
|
(byte) plot::idx#0 ← (byte[]) plots#0 *idx (byte) plot::x#2
|
||||||
|
(byte~) plot::$1 ← (byte*) SCREEN#0 *idx (byte) plot::idx#0
|
||||||
|
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
|
||||||
|
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2
|
||||||
|
to:plot::@return
|
||||||
|
plot::@return: scope:[plot] from plot
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@3: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @3
|
||||||
|
|
||||||
|
Not aliassing across scopes: line::x#0 line::x0#0
|
||||||
|
Not aliassing across scopes: line::x1#1 line::x1#0
|
||||||
|
Not aliassing across scopes: plot::x#0 line::x#0
|
||||||
|
Not aliassing across scopes: plot::x#1 line::x#2
|
||||||
|
Not aliassing across scopes: plot::x#2 plot::x#0
|
||||||
|
Self Phi Eliminated (byte) line::x1#2
|
||||||
|
Succesful SSA optimization Pass2SelfPhiElimination
|
||||||
|
CONTROL FLOW GRAPH
|
||||||
|
@begin: scope:[] from
|
||||||
|
(byte[]) plots#0 ← ((byte*)) (word/signed word) 4096
|
||||||
|
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
|
||||||
|
to:@3
|
||||||
|
main: scope:[main] from @3
|
||||||
|
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
||||||
|
to:main::@1
|
||||||
|
main::@1: scope:[main] from main main::@1
|
||||||
|
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||||
|
*((byte[]) plots#0 + (byte) main::i#2) ← (byte) main::i#2
|
||||||
|
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte/signed byte/word/signed word) 0
|
||||||
|
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||||
|
(boolean~) main::$0 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 40
|
||||||
|
if((boolean~) main::$0) goto main::@1
|
||||||
|
to:main::@2
|
||||||
|
main::@2: scope:[main] from main::@1 main::@5
|
||||||
|
(byte) line::x0#0 ← (byte/signed byte/word/signed word) 0
|
||||||
|
(byte) line::x1#0 ← (byte/signed byte/word/signed word) 10
|
||||||
|
call line param-assignment
|
||||||
|
to:main::@5
|
||||||
|
main::@5: scope:[main] from main::@2
|
||||||
|
if(true) goto main::@2
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main::@5
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
line: scope:[line] from main::@2
|
||||||
|
(byte) line::x1#1 ← phi( main::@2/(byte) line::x1#0 )
|
||||||
|
(byte) line::x#0 ← phi( main::@2/(byte) line::x0#0 )
|
||||||
|
(boolean~) line::$1 ← (byte) line::x#0 >= (byte) line::x1#1
|
||||||
|
if((boolean~) line::$1) goto line::@1
|
||||||
|
to:line::@4
|
||||||
|
line::@1: scope:[line] from line
|
||||||
|
(byte) plot::x#0 ← (byte) line::x#0
|
||||||
|
call plot param-assignment
|
||||||
|
to:line::@return
|
||||||
|
line::@4: scope:[line] from line
|
||||||
|
to:line::@2
|
||||||
|
line::@2: scope:[line] from line::@4 line::@8
|
||||||
|
(byte) line::x1#2 ← phi( line::@4/(byte) line::x1#1 )
|
||||||
|
(byte) line::x#2 ← phi( line::@4/(byte) line::x#0 line::@8/(byte) line::x#1 )
|
||||||
|
(byte) plot::x#1 ← (byte) line::x#2
|
||||||
|
call plot param-assignment
|
||||||
|
to:line::@8
|
||||||
|
line::@8: scope:[line] from line::@2
|
||||||
|
(byte) line::x#1 ← ++ (byte) line::x#2
|
||||||
|
(boolean~) line::$3 ← (byte) line::x#1 <= (byte) line::x1#2
|
||||||
|
if((boolean~) line::$3) goto line::@2
|
||||||
|
to:line::@return
|
||||||
|
line::@return: scope:[line] from line::@1 line::@8
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
plot: scope:[plot] from line::@1 line::@2
|
||||||
|
(byte) plot::x#2 ← phi( line::@1/(byte) plot::x#0 line::@2/(byte) plot::x#1 )
|
||||||
|
(byte) plot::idx#0 ← (byte[]) plots#0 *idx (byte) plot::x#2
|
||||||
|
(byte~) plot::$1 ← (byte*) SCREEN#0 *idx (byte) plot::idx#0
|
||||||
|
(byte~) plot::$2 ← (byte~) plot::$1 + (byte/signed byte/word/signed word) 1
|
||||||
|
*((byte*) SCREEN#0 + (byte) plot::idx#0) ← (byte~) plot::$2
|
||||||
|
to:plot::@return
|
||||||
|
plot::@return: scope:[plot] from plot
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@3: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @3
|
||||||
|
|
||||||
|
Redundant Phi (byte) line::x#0 (byte) line::x0#0
|
||||||
|
Redundant Phi (byte) line::x1#1 (byte) line::x1#0
|
||||||
|
Redundant Phi (byte) line::x1#2 (byte) line::x1#1
|
||||||
Succesful SSA optimization Pass2RedundantPhiElimination
|
Succesful SSA optimization Pass2RedundantPhiElimination
|
||||||
CONTROL FLOW GRAPH
|
CONTROL FLOW GRAPH
|
||||||
@begin: scope:[] from
|
@begin: scope:[] from
|
||||||
|
10
src/main/java/dk/camelot64/kickc/test/ref/constabsmin.asm
Normal file
10
src/main/java/dk/camelot64/kickc/test/ref/constabsmin.asm
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
.pc = $801 "Basic"
|
||||||
|
:BasicUpstart(main)
|
||||||
|
.pc = $80d "Program"
|
||||||
|
.const SCREEN = $400
|
||||||
|
jsr main
|
||||||
|
main: {
|
||||||
|
lda #1
|
||||||
|
sta SCREEN
|
||||||
|
rts
|
||||||
|
}
|
15
src/main/java/dk/camelot64/kickc/test/ref/constabsmin.cfg
Normal file
15
src/main/java/dk/camelot64/kickc/test/ref/constabsmin.cfg
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
@begin: scope:[] from
|
||||||
|
[0] phi() [ ] ( )
|
||||||
|
to:@1
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
[1] phi() [ ] ( )
|
||||||
|
[2] call main param-assignment [ ] ( )
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
[3] phi() [ ] ( )
|
||||||
|
main: scope:[main] from @1
|
||||||
|
[4] *((const byte*) SCREEN#0) ← (byte/signed byte/word/signed word) 1 [ ] ( main:2 [ ] )
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
[5] return [ ] ( main:2 [ ] )
|
||||||
|
to:@return
|
426
src/main/java/dk/camelot64/kickc/test/ref/constabsmin.log
Normal file
426
src/main/java/dk/camelot64/kickc/test/ref/constabsmin.log
Normal file
@ -0,0 +1,426 @@
|
|||||||
|
const byte* SCREEN = $0400;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
*SCREEN = 1;
|
||||||
|
}
|
||||||
|
PROGRAM
|
||||||
|
(byte*) SCREEN ← (word/signed word) 1024
|
||||||
|
proc (void()) main()
|
||||||
|
*((byte*) SCREEN) ← (byte/signed byte/word/signed word) 1
|
||||||
|
main::@return:
|
||||||
|
return
|
||||||
|
endproc // main()
|
||||||
|
call main
|
||||||
|
|
||||||
|
SYMBOLS
|
||||||
|
(byte*) SCREEN
|
||||||
|
(void()) main()
|
||||||
|
(label) main::@return
|
||||||
|
|
||||||
|
Promoting word/signed word to byte* in SCREEN ← ((byte*)) 1024
|
||||||
|
INITIAL CONTROL FLOW GRAPH
|
||||||
|
@begin: scope:[] from
|
||||||
|
(byte*) SCREEN ← ((byte*)) (word/signed word) 1024
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from
|
||||||
|
*((byte*) SCREEN) ← (byte/signed byte/word/signed word) 1
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
|
||||||
|
CONTROL FLOW GRAPH
|
||||||
|
@begin: scope:[] from
|
||||||
|
(byte*) SCREEN ← ((byte*)) (word/signed word) 1024
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from
|
||||||
|
*((byte*) SCREEN) ← (byte/signed byte/word/signed word) 1
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
|
||||||
|
PROCEDURE MODIFY VARIABLE ANALYSIS
|
||||||
|
|
||||||
|
CONTROL FLOW GRAPH WITH ASSIGNMENT CALL
|
||||||
|
@begin: scope:[] from
|
||||||
|
(byte*) SCREEN ← ((byte*)) (word/signed word) 1024
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
*((byte*) SCREEN) ← (byte/signed byte/word/signed word) 1
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@2
|
||||||
|
@2: scope:[] from @1
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @2
|
||||||
|
|
||||||
|
Completing Phi functions...
|
||||||
|
CONTROL FLOW GRAPH SSA
|
||||||
|
@begin: scope:[] from
|
||||||
|
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
*((byte*) SCREEN#0) ← (byte/signed byte/word/signed word) 1
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@2
|
||||||
|
@2: scope:[] from @1
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @2
|
||||||
|
|
||||||
|
CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN
|
||||||
|
@begin: scope:[] from
|
||||||
|
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
*((byte*) SCREEN#0) ← (byte/signed byte/word/signed word) 1
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@2
|
||||||
|
@2: scope:[] from @1
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @2
|
||||||
|
|
||||||
|
INITIAL SSA SYMBOL TABLE
|
||||||
|
(label) @1
|
||||||
|
(label) @2
|
||||||
|
(label) @begin
|
||||||
|
(label) @end
|
||||||
|
(byte*) SCREEN
|
||||||
|
(byte*) SCREEN#0
|
||||||
|
(void()) main()
|
||||||
|
(label) main::@return
|
||||||
|
|
||||||
|
Culled Empty Block (label) @2
|
||||||
|
Succesful SSA optimization Pass2CullEmptyBlocks
|
||||||
|
CONTROL FLOW GRAPH
|
||||||
|
@begin: scope:[] from
|
||||||
|
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
*((byte*) SCREEN#0) ← (byte/signed byte/word/signed word) 1
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
|
||||||
|
Constant (const byte*) SCREEN#0 = ((byte*))1024
|
||||||
|
Succesful SSA optimization Pass2ConstantIdentification
|
||||||
|
CONTROL FLOW GRAPH
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
*((const byte*) SCREEN#0) ← (byte/signed byte/word/signed word) 1
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
|
||||||
|
FINAL SYMBOL TABLE
|
||||||
|
(label) @1
|
||||||
|
(label) @begin
|
||||||
|
(label) @end
|
||||||
|
(byte*) SCREEN
|
||||||
|
(const byte*) SCREEN#0 = ((byte*))(word/signed word) 1024
|
||||||
|
(void()) main()
|
||||||
|
(label) main::@return
|
||||||
|
|
||||||
|
Block Sequence Planned @begin @1 @end main main::@return
|
||||||
|
Block Sequence Planned @begin @1 @end main main::@return
|
||||||
|
CONTROL FLOW GRAPH - PHI LIFTED
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
*((const byte*) SCREEN#0) ← (byte/signed byte/word/signed word) 1
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
|
||||||
|
Adding NOP phi() at start of @begin
|
||||||
|
Adding NOP phi() at start of @1
|
||||||
|
Adding NOP phi() at start of @end
|
||||||
|
CALL GRAPH
|
||||||
|
Calls in [] to main:2
|
||||||
|
|
||||||
|
Propagating live ranges...
|
||||||
|
CONTROL FLOW GRAPH - LIVE RANGES FOUND
|
||||||
|
@begin: scope:[] from
|
||||||
|
[0] phi() [ ]
|
||||||
|
to:@1
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
[1] phi() [ ]
|
||||||
|
[2] call main param-assignment [ ]
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
[3] phi() [ ]
|
||||||
|
main: scope:[main] from @1
|
||||||
|
[4] *((const byte*) SCREEN#0) ← (byte/signed byte/word/signed word) 1 [ ]
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
[5] return [ ]
|
||||||
|
to:@return
|
||||||
|
|
||||||
|
Created 0 initial phi equivalence classes
|
||||||
|
Coalesced down to 0 phi equivalence classes
|
||||||
|
Block Sequence Planned @begin @1 @end main main::@return
|
||||||
|
Adding NOP phi() at start of @begin
|
||||||
|
Adding NOP phi() at start of @1
|
||||||
|
Adding NOP phi() at start of @end
|
||||||
|
Propagating live ranges...
|
||||||
|
CONTROL FLOW GRAPH - BEFORE EFFECTIVE LIVE RANGES
|
||||||
|
@begin: scope:[] from
|
||||||
|
[0] phi() [ ]
|
||||||
|
to:@1
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
[1] phi() [ ]
|
||||||
|
[2] call main param-assignment [ ]
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
[3] phi() [ ]
|
||||||
|
main: scope:[main] from @1
|
||||||
|
[4] *((const byte*) SCREEN#0) ← (byte/signed byte/word/signed word) 1 [ ]
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
[5] return [ ]
|
||||||
|
to:@return
|
||||||
|
|
||||||
|
CONTROL FLOW GRAPH - PHI MEM COALESCED
|
||||||
|
@begin: scope:[] from
|
||||||
|
[0] phi() [ ] ( )
|
||||||
|
to:@1
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
[1] phi() [ ] ( )
|
||||||
|
[2] call main param-assignment [ ] ( )
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
[3] phi() [ ] ( )
|
||||||
|
main: scope:[main] from @1
|
||||||
|
[4] *((const byte*) SCREEN#0) ← (byte/signed byte/word/signed word) 1 [ ] ( main:2 [ ] )
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main
|
||||||
|
[5] return [ ] ( main:2 [ ] )
|
||||||
|
to:@return
|
||||||
|
|
||||||
|
DOMINATORS
|
||||||
|
@begin dominated by @begin
|
||||||
|
@1 dominated by @1 @begin
|
||||||
|
@end dominated by @1 @begin @end
|
||||||
|
main dominated by @1 @begin main
|
||||||
|
main::@return dominated by main::@return @1 @begin main
|
||||||
|
|
||||||
|
NATURAL LOOPS
|
||||||
|
|
||||||
|
Found 0 loops in scope []
|
||||||
|
Found 0 loops in scope [main]
|
||||||
|
NATURAL LOOPS WITH DEPTH
|
||||||
|
|
||||||
|
|
||||||
|
VARIABLE REGISTER WEIGHTS
|
||||||
|
(byte*) SCREEN
|
||||||
|
(void()) main()
|
||||||
|
|
||||||
|
Initial phi equivalence classes
|
||||||
|
Complete equivalence classes
|
||||||
|
INITIAL ASM
|
||||||
|
//SEG0 Basic Upstart
|
||||||
|
.pc = $801 "Basic"
|
||||||
|
:BasicUpstart(main)
|
||||||
|
.pc = $80d "Program"
|
||||||
|
//SEG1 Global Constants & labels
|
||||||
|
.const SCREEN = $400
|
||||||
|
//SEG2 @begin
|
||||||
|
bbegin:
|
||||||
|
//SEG3 [1] phi from @begin to @1 [phi:@begin->@1]
|
||||||
|
b1_from_bbegin:
|
||||||
|
jmp b1
|
||||||
|
//SEG4 @1
|
||||||
|
b1:
|
||||||
|
//SEG5 [2] call main param-assignment [ ] ( )
|
||||||
|
jsr main
|
||||||
|
//SEG6 [3] phi from @1 to @end [phi:@1->@end]
|
||||||
|
bend_from_b1:
|
||||||
|
jmp bend
|
||||||
|
//SEG7 @end
|
||||||
|
bend:
|
||||||
|
//SEG8 main
|
||||||
|
main: {
|
||||||
|
//SEG9 [4] *((const byte*) SCREEN#0) ← (byte/signed byte/word/signed word) 1 [ ] ( main:2 [ ] ) -- _deref_cowo1=coby2
|
||||||
|
lda #1
|
||||||
|
sta SCREEN
|
||||||
|
jmp breturn
|
||||||
|
//SEG10 main::@return
|
||||||
|
breturn:
|
||||||
|
//SEG11 [5] return [ ] ( main:2 [ ] )
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
|
||||||
|
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||||
|
Statement [4] *((const byte*) SCREEN#0) ← (byte/signed byte/word/signed word) 1 [ ] ( main:2 [ ] ) always clobbers reg byte a
|
||||||
|
|
||||||
|
REGISTER UPLIFT SCOPES
|
||||||
|
Uplift Scope [main]
|
||||||
|
Uplift Scope []
|
||||||
|
|
||||||
|
Uplifting [main] best 27 combination
|
||||||
|
Uplifting [] best 27 combination
|
||||||
|
Removing instruction jmp b1
|
||||||
|
Removing instruction jmp bend
|
||||||
|
Removing instruction jmp breturn
|
||||||
|
Succesful ASM optimization Pass5NextJumpElimination
|
||||||
|
ASSEMBLER
|
||||||
|
//SEG0 Basic Upstart
|
||||||
|
.pc = $801 "Basic"
|
||||||
|
:BasicUpstart(main)
|
||||||
|
.pc = $80d "Program"
|
||||||
|
//SEG1 Global Constants & labels
|
||||||
|
.const SCREEN = $400
|
||||||
|
//SEG2 @begin
|
||||||
|
bbegin:
|
||||||
|
//SEG3 [1] phi from @begin to @1 [phi:@begin->@1]
|
||||||
|
b1_from_bbegin:
|
||||||
|
//SEG4 @1
|
||||||
|
b1:
|
||||||
|
//SEG5 [2] call main param-assignment [ ] ( )
|
||||||
|
jsr main
|
||||||
|
//SEG6 [3] phi from @1 to @end [phi:@1->@end]
|
||||||
|
bend_from_b1:
|
||||||
|
//SEG7 @end
|
||||||
|
bend:
|
||||||
|
//SEG8 main
|
||||||
|
main: {
|
||||||
|
//SEG9 [4] *((const byte*) SCREEN#0) ← (byte/signed byte/word/signed word) 1 [ ] ( main:2 [ ] ) -- _deref_cowo1=coby2
|
||||||
|
lda #1
|
||||||
|
sta SCREEN
|
||||||
|
//SEG10 main::@return
|
||||||
|
breturn:
|
||||||
|
//SEG11 [5] return [ ] ( main:2 [ ] )
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
|
||||||
|
Removing instruction bbegin:
|
||||||
|
Removing instruction b1_from_bbegin:
|
||||||
|
Removing instruction bend_from_b1:
|
||||||
|
Succesful ASM optimization Pass5RedundantLabelElimination
|
||||||
|
ASSEMBLER
|
||||||
|
//SEG0 Basic Upstart
|
||||||
|
.pc = $801 "Basic"
|
||||||
|
:BasicUpstart(main)
|
||||||
|
.pc = $80d "Program"
|
||||||
|
//SEG1 Global Constants & labels
|
||||||
|
.const SCREEN = $400
|
||||||
|
//SEG2 @begin
|
||||||
|
//SEG3 [1] phi from @begin to @1 [phi:@begin->@1]
|
||||||
|
//SEG4 @1
|
||||||
|
b1:
|
||||||
|
//SEG5 [2] call main param-assignment [ ] ( )
|
||||||
|
jsr main
|
||||||
|
//SEG6 [3] phi from @1 to @end [phi:@1->@end]
|
||||||
|
//SEG7 @end
|
||||||
|
bend:
|
||||||
|
//SEG8 main
|
||||||
|
main: {
|
||||||
|
//SEG9 [4] *((const byte*) SCREEN#0) ← (byte/signed byte/word/signed word) 1 [ ] ( main:2 [ ] ) -- _deref_cowo1=coby2
|
||||||
|
lda #1
|
||||||
|
sta SCREEN
|
||||||
|
//SEG10 main::@return
|
||||||
|
breturn:
|
||||||
|
//SEG11 [5] return [ ] ( main:2 [ ] )
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
|
||||||
|
Removing instruction b1:
|
||||||
|
Removing instruction bend:
|
||||||
|
Removing instruction breturn:
|
||||||
|
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||||
|
ASSEMBLER
|
||||||
|
//SEG0 Basic Upstart
|
||||||
|
.pc = $801 "Basic"
|
||||||
|
:BasicUpstart(main)
|
||||||
|
.pc = $80d "Program"
|
||||||
|
//SEG1 Global Constants & labels
|
||||||
|
.const SCREEN = $400
|
||||||
|
//SEG2 @begin
|
||||||
|
//SEG3 [1] phi from @begin to @1 [phi:@begin->@1]
|
||||||
|
//SEG4 @1
|
||||||
|
//SEG5 [2] call main param-assignment [ ] ( )
|
||||||
|
jsr main
|
||||||
|
//SEG6 [3] phi from @1 to @end [phi:@1->@end]
|
||||||
|
//SEG7 @end
|
||||||
|
//SEG8 main
|
||||||
|
main: {
|
||||||
|
//SEG9 [4] *((const byte*) SCREEN#0) ← (byte/signed byte/word/signed word) 1 [ ] ( main:2 [ ] ) -- _deref_cowo1=coby2
|
||||||
|
lda #1
|
||||||
|
sta SCREEN
|
||||||
|
//SEG10 main::@return
|
||||||
|
//SEG11 [5] return [ ] ( main:2 [ ] )
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
|
||||||
|
FINAL SYMBOL TABLE
|
||||||
|
(label) @1
|
||||||
|
(label) @begin
|
||||||
|
(label) @end
|
||||||
|
(byte*) SCREEN
|
||||||
|
(const byte*) SCREEN#0 SCREEN = ((byte*))(word/signed word) 1024
|
||||||
|
(void()) main()
|
||||||
|
(label) main::@return
|
||||||
|
|
||||||
|
|
||||||
|
FINAL CODE
|
||||||
|
//SEG0 Basic Upstart
|
||||||
|
.pc = $801 "Basic"
|
||||||
|
:BasicUpstart(main)
|
||||||
|
.pc = $80d "Program"
|
||||||
|
//SEG1 Global Constants & labels
|
||||||
|
.const SCREEN = $400
|
||||||
|
//SEG2 @begin
|
||||||
|
//SEG3 [1] phi from @begin to @1 [phi:@begin->@1]
|
||||||
|
//SEG4 @1
|
||||||
|
//SEG5 [2] call main param-assignment [ ] ( )
|
||||||
|
jsr main
|
||||||
|
//SEG6 [3] phi from @1 to @end [phi:@1->@end]
|
||||||
|
//SEG7 @end
|
||||||
|
//SEG8 main
|
||||||
|
main: {
|
||||||
|
//SEG9 [4] *((const byte*) SCREEN#0) ← (byte/signed byte/word/signed word) 1 [ ] ( main:2 [ ] ) -- _deref_cowo1=coby2
|
||||||
|
lda #1
|
||||||
|
sta SCREEN
|
||||||
|
//SEG10 main::@return
|
||||||
|
//SEG11 [5] return [ ] ( main:2 [ ] )
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
|||||||
|
(label) @1
|
||||||
|
(label) @begin
|
||||||
|
(label) @end
|
||||||
|
(byte*) SCREEN
|
||||||
|
(const byte*) SCREEN#0 SCREEN = ((byte*))(word/signed word) 1024
|
||||||
|
(void()) main()
|
||||||
|
(label) main::@return
|
||||||
|
|
@ -170,18 +170,14 @@ CONTROL FLOW GRAPH SSA
|
|||||||
main: scope:[main] from @1
|
main: scope:[main] from @1
|
||||||
(byte*) BGCOL#1 ← phi( @1/(byte*) BGCOL#2 )
|
(byte*) BGCOL#1 ← phi( @1/(byte*) BGCOL#2 )
|
||||||
(byte) RED#1 ← phi( @1/(byte) RED#2 )
|
(byte) RED#1 ← phi( @1/(byte) RED#2 )
|
||||||
(byte*) SCREEN#1 ← phi( @1/(byte*) SCREEN#3 )
|
*((byte*) SCREEN#0) ← (byte) STAR#0
|
||||||
(byte) STAR#1 ← phi( @1/(byte) STAR#3 )
|
|
||||||
*((byte*) SCREEN#1) ← (byte) STAR#1
|
|
||||||
*((byte*) BGCOL#1) ← (byte) RED#1
|
*((byte*) BGCOL#1) ← (byte) RED#1
|
||||||
(byte) main::i#0 ← (byte/signed byte/word/signed word) 40
|
(byte) main::i#0 ← (byte/signed byte/word/signed word) 40
|
||||||
to:main::@1
|
to:main::@1
|
||||||
main::@1: scope:[main] from main main::@1
|
main::@1: scope:[main] from main main::@1
|
||||||
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||||
(byte*) SCREEN#2 ← phi( main/(byte*) SCREEN#1 main::@1/(byte*) SCREEN#2 )
|
(byte~) main::$0 ← (byte) STAR#0 + (byte/signed byte/word/signed word) 1
|
||||||
(byte) STAR#2 ← phi( main/(byte) STAR#1 main::@1/(byte) STAR#2 )
|
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0
|
||||||
(byte~) main::$0 ← (byte) STAR#2 + (byte/signed byte/word/signed word) 1
|
|
||||||
*((byte*) SCREEN#2 + (byte) main::i#2) ← (byte~) main::$0
|
|
||||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||||
(boolean~) main::$1 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 80
|
(boolean~) main::$1 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 80
|
||||||
if((boolean~) main::$1) goto main::@1
|
if((boolean~) main::$1) goto main::@1
|
||||||
@ -192,8 +188,6 @@ main::@return: scope:[main] from main::@1
|
|||||||
@1: scope:[] from @begin
|
@1: scope:[] from @begin
|
||||||
(byte*) BGCOL#2 ← phi( @begin/(byte*) BGCOL#0 )
|
(byte*) BGCOL#2 ← phi( @begin/(byte*) BGCOL#0 )
|
||||||
(byte) RED#2 ← phi( @begin/(byte) RED#0 )
|
(byte) RED#2 ← phi( @begin/(byte) RED#0 )
|
||||||
(byte*) SCREEN#3 ← phi( @begin/(byte*) SCREEN#0 )
|
|
||||||
(byte) STAR#3 ← phi( @begin/(byte) STAR#0 )
|
|
||||||
call main param-assignment
|
call main param-assignment
|
||||||
to:@2
|
to:@2
|
||||||
@2: scope:[] from @1
|
@2: scope:[] from @1
|
||||||
@ -214,18 +208,14 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN
|
|||||||
main: scope:[main] from @1
|
main: scope:[main] from @1
|
||||||
(byte*) BGCOL#1 ← phi( @1/(byte*) BGCOL#2 )
|
(byte*) BGCOL#1 ← phi( @1/(byte*) BGCOL#2 )
|
||||||
(byte) RED#1 ← phi( @1/(byte) RED#2 )
|
(byte) RED#1 ← phi( @1/(byte) RED#2 )
|
||||||
(byte*) SCREEN#1 ← phi( @1/(byte*) SCREEN#3 )
|
*((byte*) SCREEN#0) ← (byte) STAR#0
|
||||||
(byte) STAR#1 ← phi( @1/(byte) STAR#3 )
|
|
||||||
*((byte*) SCREEN#1) ← (byte) STAR#1
|
|
||||||
*((byte*) BGCOL#1) ← (byte) RED#1
|
*((byte*) BGCOL#1) ← (byte) RED#1
|
||||||
(byte) main::i#0 ← (byte/signed byte/word/signed word) 40
|
(byte) main::i#0 ← (byte/signed byte/word/signed word) 40
|
||||||
to:main::@1
|
to:main::@1
|
||||||
main::@1: scope:[main] from main main::@1
|
main::@1: scope:[main] from main main::@1
|
||||||
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||||
(byte*) SCREEN#2 ← phi( main/(byte*) SCREEN#1 main::@1/(byte*) SCREEN#2 )
|
(byte~) main::$0 ← (byte) STAR#0 + (byte/signed byte/word/signed word) 1
|
||||||
(byte) STAR#2 ← phi( main/(byte) STAR#1 main::@1/(byte) STAR#2 )
|
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0
|
||||||
(byte~) main::$0 ← (byte) STAR#2 + (byte/signed byte/word/signed word) 1
|
|
||||||
*((byte*) SCREEN#2 + (byte) main::i#2) ← (byte~) main::$0
|
|
||||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||||
(boolean~) main::$1 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 80
|
(boolean~) main::$1 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 80
|
||||||
if((boolean~) main::$1) goto main::@1
|
if((boolean~) main::$1) goto main::@1
|
||||||
@ -236,8 +226,6 @@ main::@return: scope:[main] from main::@1
|
|||||||
@1: scope:[] from @begin
|
@1: scope:[] from @begin
|
||||||
(byte*) BGCOL#2 ← phi( @begin/(byte*) BGCOL#0 )
|
(byte*) BGCOL#2 ← phi( @begin/(byte*) BGCOL#0 )
|
||||||
(byte) RED#2 ← phi( @begin/(byte) RED#0 )
|
(byte) RED#2 ← phi( @begin/(byte) RED#0 )
|
||||||
(byte*) SCREEN#3 ← phi( @begin/(byte*) SCREEN#0 )
|
|
||||||
(byte) STAR#3 ← phi( @begin/(byte) STAR#0 )
|
|
||||||
call main param-assignment
|
call main param-assignment
|
||||||
to:@2
|
to:@2
|
||||||
@2: scope:[] from @1
|
@2: scope:[] from @1
|
||||||
@ -262,14 +250,8 @@ INITIAL SSA SYMBOL TABLE
|
|||||||
(byte) RED#2
|
(byte) RED#2
|
||||||
(byte*) SCREEN
|
(byte*) SCREEN
|
||||||
(byte*) SCREEN#0
|
(byte*) SCREEN#0
|
||||||
(byte*) SCREEN#1
|
|
||||||
(byte*) SCREEN#2
|
|
||||||
(byte*) SCREEN#3
|
|
||||||
(byte) STAR
|
(byte) STAR
|
||||||
(byte) STAR#0
|
(byte) STAR#0
|
||||||
(byte) STAR#1
|
|
||||||
(byte) STAR#2
|
|
||||||
(byte) STAR#3
|
|
||||||
(byte*) VIC
|
(byte*) VIC
|
||||||
(byte*) VIC#0
|
(byte*) VIC#0
|
||||||
(void()) main()
|
(void()) main()
|
||||||
@ -298,18 +280,14 @@ CONTROL FLOW GRAPH
|
|||||||
main: scope:[main] from @1
|
main: scope:[main] from @1
|
||||||
(byte*) BGCOL#1 ← phi( @1/(byte*) BGCOL#2 )
|
(byte*) BGCOL#1 ← phi( @1/(byte*) BGCOL#2 )
|
||||||
(byte) RED#1 ← phi( @1/(byte) RED#2 )
|
(byte) RED#1 ← phi( @1/(byte) RED#2 )
|
||||||
(byte*) SCREEN#1 ← phi( @1/(byte*) SCREEN#3 )
|
*((byte*) SCREEN#0) ← (byte) STAR#0
|
||||||
(byte) STAR#1 ← phi( @1/(byte) STAR#3 )
|
|
||||||
*((byte*) SCREEN#1) ← (byte) STAR#1
|
|
||||||
*((byte*) BGCOL#1) ← (byte) RED#1
|
*((byte*) BGCOL#1) ← (byte) RED#1
|
||||||
(byte) main::i#0 ← (byte/signed byte/word/signed word) 40
|
(byte) main::i#0 ← (byte/signed byte/word/signed word) 40
|
||||||
to:main::@1
|
to:main::@1
|
||||||
main::@1: scope:[main] from main main::@1
|
main::@1: scope:[main] from main main::@1
|
||||||
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||||
(byte*) SCREEN#2 ← phi( main/(byte*) SCREEN#1 main::@1/(byte*) SCREEN#2 )
|
(byte~) main::$0 ← (byte) STAR#0 + (byte/signed byte/word/signed word) 1
|
||||||
(byte) STAR#2 ← phi( main/(byte) STAR#1 main::@1/(byte) STAR#2 )
|
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0
|
||||||
(byte~) main::$0 ← (byte) STAR#2 + (byte/signed byte/word/signed word) 1
|
|
||||||
*((byte*) SCREEN#2 + (byte) main::i#2) ← (byte~) main::$0
|
|
||||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||||
(boolean~) main::$1 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 80
|
(boolean~) main::$1 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 80
|
||||||
if((boolean~) main::$1) goto main::@1
|
if((boolean~) main::$1) goto main::@1
|
||||||
@ -320,19 +298,13 @@ main::@return: scope:[main] from main::@1
|
|||||||
@1: scope:[] from @begin
|
@1: scope:[] from @begin
|
||||||
(byte*) BGCOL#2 ← phi( @begin/(byte*) BGCOL#0 )
|
(byte*) BGCOL#2 ← phi( @begin/(byte*) BGCOL#0 )
|
||||||
(byte) RED#2 ← phi( @begin/(byte) RED#0 )
|
(byte) RED#2 ← phi( @begin/(byte) RED#0 )
|
||||||
(byte*) SCREEN#3 ← phi( @begin/(byte*) SCREEN#0 )
|
|
||||||
(byte) STAR#3 ← phi( @begin/(byte) STAR#0 )
|
|
||||||
call main param-assignment
|
call main param-assignment
|
||||||
to:@end
|
to:@end
|
||||||
@end: scope:[] from @1
|
@end: scope:[] from @1
|
||||||
|
|
||||||
Not aliassing across scopes: STAR#1 STAR#3
|
|
||||||
Not aliassing across scopes: SCREEN#1 SCREEN#3
|
|
||||||
Not aliassing across scopes: RED#1 RED#2
|
Not aliassing across scopes: RED#1 RED#2
|
||||||
Not aliassing across scopes: BGCOL#1 BGCOL#2
|
Not aliassing across scopes: BGCOL#1 BGCOL#2
|
||||||
Alias (byte*) BGCOL#0 = (byte*~) $2 (byte*) BGCOL#2
|
Alias (byte*) BGCOL#0 = (byte*~) $2 (byte*) BGCOL#2
|
||||||
Alias (byte) STAR#0 = (byte) STAR#3
|
|
||||||
Alias (byte*) SCREEN#0 = (byte*) SCREEN#3
|
|
||||||
Alias (byte) RED#0 = (byte) RED#2
|
Alias (byte) RED#0 = (byte) RED#2
|
||||||
Succesful SSA optimization Pass2AliasElimination
|
Succesful SSA optimization Pass2AliasElimination
|
||||||
CONTROL FLOW GRAPH
|
CONTROL FLOW GRAPH
|
||||||
@ -348,18 +320,14 @@ CONTROL FLOW GRAPH
|
|||||||
main: scope:[main] from @1
|
main: scope:[main] from @1
|
||||||
(byte*) BGCOL#1 ← phi( @1/(byte*) BGCOL#0 )
|
(byte*) BGCOL#1 ← phi( @1/(byte*) BGCOL#0 )
|
||||||
(byte) RED#1 ← phi( @1/(byte) RED#0 )
|
(byte) RED#1 ← phi( @1/(byte) RED#0 )
|
||||||
(byte*) SCREEN#1 ← phi( @1/(byte*) SCREEN#0 )
|
*((byte*) SCREEN#0) ← (byte) STAR#0
|
||||||
(byte) STAR#1 ← phi( @1/(byte) STAR#0 )
|
|
||||||
*((byte*) SCREEN#1) ← (byte) STAR#1
|
|
||||||
*((byte*) BGCOL#1) ← (byte) RED#1
|
*((byte*) BGCOL#1) ← (byte) RED#1
|
||||||
(byte) main::i#0 ← (byte/signed byte/word/signed word) 40
|
(byte) main::i#0 ← (byte/signed byte/word/signed word) 40
|
||||||
to:main::@1
|
to:main::@1
|
||||||
main::@1: scope:[main] from main main::@1
|
main::@1: scope:[main] from main main::@1
|
||||||
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
||||||
(byte*) SCREEN#2 ← phi( main/(byte*) SCREEN#1 main::@1/(byte*) SCREEN#2 )
|
(byte~) main::$0 ← (byte) STAR#0 + (byte/signed byte/word/signed word) 1
|
||||||
(byte) STAR#2 ← phi( main/(byte) STAR#1 main::@1/(byte) STAR#2 )
|
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte~) main::$0
|
||||||
(byte~) main::$0 ← (byte) STAR#2 + (byte/signed byte/word/signed word) 1
|
|
||||||
*((byte*) SCREEN#2 + (byte) main::i#2) ← (byte~) main::$0
|
|
||||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||||
(boolean~) main::$1 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 80
|
(boolean~) main::$1 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 80
|
||||||
if((boolean~) main::$1) goto main::@1
|
if((boolean~) main::$1) goto main::@1
|
||||||
@ -372,56 +340,10 @@ main::@return: scope:[main] from main::@1
|
|||||||
to:@end
|
to:@end
|
||||||
@end: scope:[] from @1
|
@end: scope:[] from @1
|
||||||
|
|
||||||
Not aliassing across scopes: STAR#1 STAR#0
|
|
||||||
Not aliassing across scopes: SCREEN#1 SCREEN#0
|
|
||||||
Not aliassing across scopes: RED#1 RED#0
|
Not aliassing across scopes: RED#1 RED#0
|
||||||
Not aliassing across scopes: BGCOL#1 BGCOL#0
|
Not aliassing across scopes: BGCOL#1 BGCOL#0
|
||||||
Self Phi Eliminated (byte) STAR#2
|
|
||||||
Self Phi Eliminated (byte*) SCREEN#2
|
|
||||||
Succesful SSA optimization Pass2SelfPhiElimination
|
|
||||||
CONTROL FLOW GRAPH
|
|
||||||
@begin: scope:[] from
|
|
||||||
(byte*) SCREEN#0 ← ((byte*)) (word/signed word) 1024
|
|
||||||
(byte) STAR#0 ← (byte/signed byte/word/signed word) 81
|
|
||||||
(byte*) VIC#0 ← ((byte*)) (word) 53248
|
|
||||||
(byte/signed byte/word/signed word~) $0 ← (byte/signed byte/word/signed word) 16 * (byte/signed byte/word/signed word) 2
|
|
||||||
(byte*~) $1 ← (byte*) VIC#0 + (byte/signed byte/word/signed word~) $0
|
|
||||||
(byte*) BGCOL#0 ← (byte*~) $1 + (byte/signed byte/word/signed word) 1
|
|
||||||
(byte) RED#0 ← (byte/signed byte/word/signed word) 2
|
|
||||||
to:@1
|
|
||||||
main: scope:[main] from @1
|
|
||||||
(byte*) BGCOL#1 ← phi( @1/(byte*) BGCOL#0 )
|
|
||||||
(byte) RED#1 ← phi( @1/(byte) RED#0 )
|
|
||||||
(byte*) SCREEN#1 ← phi( @1/(byte*) SCREEN#0 )
|
|
||||||
(byte) STAR#1 ← phi( @1/(byte) STAR#0 )
|
|
||||||
*((byte*) SCREEN#1) ← (byte) STAR#1
|
|
||||||
*((byte*) BGCOL#1) ← (byte) RED#1
|
|
||||||
(byte) main::i#0 ← (byte/signed byte/word/signed word) 40
|
|
||||||
to:main::@1
|
|
||||||
main::@1: scope:[main] from main main::@1
|
|
||||||
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
|
|
||||||
(byte*) SCREEN#2 ← phi( main/(byte*) SCREEN#1 )
|
|
||||||
(byte) STAR#2 ← phi( main/(byte) STAR#1 )
|
|
||||||
(byte~) main::$0 ← (byte) STAR#2 + (byte/signed byte/word/signed word) 1
|
|
||||||
*((byte*) SCREEN#2 + (byte) main::i#2) ← (byte~) main::$0
|
|
||||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
|
||||||
(boolean~) main::$1 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 80
|
|
||||||
if((boolean~) main::$1) goto main::@1
|
|
||||||
to:main::@return
|
|
||||||
main::@return: scope:[main] from main::@1
|
|
||||||
return
|
|
||||||
to:@return
|
|
||||||
@1: scope:[] from @begin
|
|
||||||
call main param-assignment
|
|
||||||
to:@end
|
|
||||||
@end: scope:[] from @1
|
|
||||||
|
|
||||||
Redundant Phi (byte) STAR#1 (byte) STAR#0
|
|
||||||
Redundant Phi (byte*) SCREEN#1 (byte*) SCREEN#0
|
|
||||||
Redundant Phi (byte) RED#1 (byte) RED#0
|
Redundant Phi (byte) RED#1 (byte) RED#0
|
||||||
Redundant Phi (byte*) BGCOL#1 (byte*) BGCOL#0
|
Redundant Phi (byte*) BGCOL#1 (byte*) BGCOL#0
|
||||||
Redundant Phi (byte) STAR#2 (byte) STAR#1
|
|
||||||
Redundant Phi (byte*) SCREEN#2 (byte*) SCREEN#1
|
|
||||||
Succesful SSA optimization Pass2RedundantPhiElimination
|
Succesful SSA optimization Pass2RedundantPhiElimination
|
||||||
CONTROL FLOW GRAPH
|
CONTROL FLOW GRAPH
|
||||||
@begin: scope:[] from
|
@begin: scope:[] from
|
||||||
|
@ -78,7 +78,6 @@ main::@return: scope:[main] from main
|
|||||||
to:@end
|
to:@end
|
||||||
@end: scope:[] from @2
|
@end: scope:[] from @2
|
||||||
|
|
||||||
Completing Phi functions...
|
|
||||||
Completing Phi functions...
|
Completing Phi functions...
|
||||||
CONTROL FLOW GRAPH SSA
|
CONTROL FLOW GRAPH SSA
|
||||||
@begin: scope:[] from
|
@begin: scope:[] from
|
||||||
@ -86,16 +85,12 @@ CONTROL FLOW GRAPH SSA
|
|||||||
(byte) RED#0 ← (byte/signed byte/word/signed word) 2
|
(byte) RED#0 ← (byte/signed byte/word/signed word) 2
|
||||||
to:@1
|
to:@1
|
||||||
main: scope:[main] from @1
|
main: scope:[main] from @1
|
||||||
(byte*) BGCOL#1 ← phi( @1/(byte*) BGCOL#2 )
|
*((byte*) BGCOL#0) ← (byte) RED#0
|
||||||
(byte) RED#1 ← phi( @1/(byte) RED#2 )
|
|
||||||
*((byte*) BGCOL#1) ← (byte) RED#1
|
|
||||||
to:main::@return
|
to:main::@return
|
||||||
main::@return: scope:[main] from main
|
main::@return: scope:[main] from main
|
||||||
return
|
return
|
||||||
to:@return
|
to:@return
|
||||||
@1: scope:[] from @begin
|
@1: scope:[] from @begin
|
||||||
(byte*) BGCOL#2 ← phi( @begin/(byte*) BGCOL#0 )
|
|
||||||
(byte) RED#2 ← phi( @begin/(byte) RED#0 )
|
|
||||||
call main param-assignment
|
call main param-assignment
|
||||||
to:@2
|
to:@2
|
||||||
@2: scope:[] from @1
|
@2: scope:[] from @1
|
||||||
@ -108,16 +103,12 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN
|
|||||||
(byte) RED#0 ← (byte/signed byte/word/signed word) 2
|
(byte) RED#0 ← (byte/signed byte/word/signed word) 2
|
||||||
to:@1
|
to:@1
|
||||||
main: scope:[main] from @1
|
main: scope:[main] from @1
|
||||||
(byte*) BGCOL#1 ← phi( @1/(byte*) BGCOL#2 )
|
*((byte*) BGCOL#0) ← (byte) RED#0
|
||||||
(byte) RED#1 ← phi( @1/(byte) RED#2 )
|
|
||||||
*((byte*) BGCOL#1) ← (byte) RED#1
|
|
||||||
to:main::@return
|
to:main::@return
|
||||||
main::@return: scope:[main] from main
|
main::@return: scope:[main] from main
|
||||||
return
|
return
|
||||||
to:@return
|
to:@return
|
||||||
@1: scope:[] from @begin
|
@1: scope:[] from @begin
|
||||||
(byte*) BGCOL#2 ← phi( @begin/(byte*) BGCOL#0 )
|
|
||||||
(byte) RED#2 ← phi( @begin/(byte) RED#0 )
|
|
||||||
call main param-assignment
|
call main param-assignment
|
||||||
to:@2
|
to:@2
|
||||||
@2: scope:[] from @1
|
@2: scope:[] from @1
|
||||||
@ -131,66 +122,14 @@ INITIAL SSA SYMBOL TABLE
|
|||||||
(label) @end
|
(label) @end
|
||||||
(byte*) BGCOL
|
(byte*) BGCOL
|
||||||
(byte*) BGCOL#0
|
(byte*) BGCOL#0
|
||||||
(byte*) BGCOL#1
|
|
||||||
(byte*) BGCOL#2
|
|
||||||
(byte) RED
|
(byte) RED
|
||||||
(byte) RED#0
|
(byte) RED#0
|
||||||
(byte) RED#1
|
|
||||||
(byte) RED#2
|
|
||||||
(void()) main()
|
(void()) main()
|
||||||
(label) main::@return
|
(label) main::@return
|
||||||
|
|
||||||
Culled Empty Block (label) @2
|
Culled Empty Block (label) @2
|
||||||
Succesful SSA optimization Pass2CullEmptyBlocks
|
Succesful SSA optimization Pass2CullEmptyBlocks
|
||||||
CONTROL FLOW GRAPH
|
CONTROL FLOW GRAPH
|
||||||
@begin: scope:[] from
|
|
||||||
(byte*) BGCOL#0 ← ((byte*)) (word) 53281
|
|
||||||
(byte) RED#0 ← (byte/signed byte/word/signed word) 2
|
|
||||||
to:@1
|
|
||||||
main: scope:[main] from @1
|
|
||||||
(byte*) BGCOL#1 ← phi( @1/(byte*) BGCOL#2 )
|
|
||||||
(byte) RED#1 ← phi( @1/(byte) RED#2 )
|
|
||||||
*((byte*) BGCOL#1) ← (byte) RED#1
|
|
||||||
to:main::@return
|
|
||||||
main::@return: scope:[main] from main
|
|
||||||
return
|
|
||||||
to:@return
|
|
||||||
@1: scope:[] from @begin
|
|
||||||
(byte*) BGCOL#2 ← phi( @begin/(byte*) BGCOL#0 )
|
|
||||||
(byte) RED#2 ← phi( @begin/(byte) RED#0 )
|
|
||||||
call main param-assignment
|
|
||||||
to:@end
|
|
||||||
@end: scope:[] from @1
|
|
||||||
|
|
||||||
Not aliassing across scopes: RED#1 RED#2
|
|
||||||
Not aliassing across scopes: BGCOL#1 BGCOL#2
|
|
||||||
Alias (byte) RED#0 = (byte) RED#2
|
|
||||||
Alias (byte*) BGCOL#0 = (byte*) BGCOL#2
|
|
||||||
Succesful SSA optimization Pass2AliasElimination
|
|
||||||
CONTROL FLOW GRAPH
|
|
||||||
@begin: scope:[] from
|
|
||||||
(byte*) BGCOL#0 ← ((byte*)) (word) 53281
|
|
||||||
(byte) RED#0 ← (byte/signed byte/word/signed word) 2
|
|
||||||
to:@1
|
|
||||||
main: scope:[main] from @1
|
|
||||||
(byte*) BGCOL#1 ← phi( @1/(byte*) BGCOL#0 )
|
|
||||||
(byte) RED#1 ← phi( @1/(byte) RED#0 )
|
|
||||||
*((byte*) BGCOL#1) ← (byte) RED#1
|
|
||||||
to:main::@return
|
|
||||||
main::@return: scope:[main] from main
|
|
||||||
return
|
|
||||||
to:@return
|
|
||||||
@1: scope:[] from @begin
|
|
||||||
call main param-assignment
|
|
||||||
to:@end
|
|
||||||
@end: scope:[] from @1
|
|
||||||
|
|
||||||
Not aliassing across scopes: RED#1 RED#0
|
|
||||||
Not aliassing across scopes: BGCOL#1 BGCOL#0
|
|
||||||
Redundant Phi (byte) RED#1 (byte) RED#0
|
|
||||||
Redundant Phi (byte*) BGCOL#1 (byte*) BGCOL#0
|
|
||||||
Succesful SSA optimization Pass2RedundantPhiElimination
|
|
||||||
CONTROL FLOW GRAPH
|
|
||||||
@begin: scope:[] from
|
@begin: scope:[] from
|
||||||
(byte*) BGCOL#0 ← ((byte*)) (word) 53281
|
(byte*) BGCOL#0 ← ((byte*)) (word) 53281
|
||||||
(byte) RED#0 ← (byte/signed byte/word/signed word) 2
|
(byte) RED#0 ← (byte/signed byte/word/signed word) 2
|
||||||
|
@ -88,7 +88,6 @@ main::@return: scope:[main] from main
|
|||||||
to:@end
|
to:@end
|
||||||
@end: scope:[] from @2
|
@end: scope:[] from @2
|
||||||
|
|
||||||
Completing Phi functions...
|
|
||||||
Completing Phi functions...
|
Completing Phi functions...
|
||||||
CONTROL FLOW GRAPH SSA
|
CONTROL FLOW GRAPH SSA
|
||||||
@begin: scope:[] from
|
@begin: scope:[] from
|
||||||
@ -96,18 +95,14 @@ CONTROL FLOW GRAPH SSA
|
|||||||
(byte) RED#0 ← (byte/signed byte/word/signed word) 2
|
(byte) RED#0 ← (byte/signed byte/word/signed word) 2
|
||||||
to:@1
|
to:@1
|
||||||
main: scope:[main] from @1
|
main: scope:[main] from @1
|
||||||
(byte*) BGCOL#1 ← phi( @1/(byte*) BGCOL#2 )
|
|
||||||
(byte) RED#1 ← phi( @1/(byte) RED#2 )
|
|
||||||
(byte*) main::screen#0 ← ((byte*)) (word/signed word) 1024
|
(byte*) main::screen#0 ← ((byte*)) (word/signed word) 1024
|
||||||
*((byte*) main::screen#0) ← (byte/signed byte/word/signed word) 1
|
*((byte*) main::screen#0) ← (byte/signed byte/word/signed word) 1
|
||||||
*((byte*) BGCOL#1) ← (byte) RED#1
|
*((byte*) BGCOL#0) ← (byte) RED#0
|
||||||
to:main::@return
|
to:main::@return
|
||||||
main::@return: scope:[main] from main
|
main::@return: scope:[main] from main
|
||||||
return
|
return
|
||||||
to:@return
|
to:@return
|
||||||
@1: scope:[] from @begin
|
@1: scope:[] from @begin
|
||||||
(byte*) BGCOL#2 ← phi( @begin/(byte*) BGCOL#0 )
|
|
||||||
(byte) RED#2 ← phi( @begin/(byte) RED#0 )
|
|
||||||
call main param-assignment
|
call main param-assignment
|
||||||
to:@2
|
to:@2
|
||||||
@2: scope:[] from @1
|
@2: scope:[] from @1
|
||||||
@ -120,18 +115,14 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN
|
|||||||
(byte) RED#0 ← (byte/signed byte/word/signed word) 2
|
(byte) RED#0 ← (byte/signed byte/word/signed word) 2
|
||||||
to:@1
|
to:@1
|
||||||
main: scope:[main] from @1
|
main: scope:[main] from @1
|
||||||
(byte*) BGCOL#1 ← phi( @1/(byte*) BGCOL#2 )
|
|
||||||
(byte) RED#1 ← phi( @1/(byte) RED#2 )
|
|
||||||
(byte*) main::screen#0 ← ((byte*)) (word/signed word) 1024
|
(byte*) main::screen#0 ← ((byte*)) (word/signed word) 1024
|
||||||
*((byte*) main::screen#0) ← (byte/signed byte/word/signed word) 1
|
*((byte*) main::screen#0) ← (byte/signed byte/word/signed word) 1
|
||||||
*((byte*) BGCOL#1) ← (byte) RED#1
|
*((byte*) BGCOL#0) ← (byte) RED#0
|
||||||
to:main::@return
|
to:main::@return
|
||||||
main::@return: scope:[main] from main
|
main::@return: scope:[main] from main
|
||||||
return
|
return
|
||||||
to:@return
|
to:@return
|
||||||
@1: scope:[] from @begin
|
@1: scope:[] from @begin
|
||||||
(byte*) BGCOL#2 ← phi( @begin/(byte*) BGCOL#0 )
|
|
||||||
(byte) RED#2 ← phi( @begin/(byte) RED#0 )
|
|
||||||
call main param-assignment
|
call main param-assignment
|
||||||
to:@2
|
to:@2
|
||||||
@2: scope:[] from @1
|
@2: scope:[] from @1
|
||||||
@ -145,12 +136,8 @@ INITIAL SSA SYMBOL TABLE
|
|||||||
(label) @end
|
(label) @end
|
||||||
(byte*) BGCOL
|
(byte*) BGCOL
|
||||||
(byte*) BGCOL#0
|
(byte*) BGCOL#0
|
||||||
(byte*) BGCOL#1
|
|
||||||
(byte*) BGCOL#2
|
|
||||||
(byte) RED
|
(byte) RED
|
||||||
(byte) RED#0
|
(byte) RED#0
|
||||||
(byte) RED#1
|
|
||||||
(byte) RED#2
|
|
||||||
(void()) main()
|
(void()) main()
|
||||||
(label) main::@return
|
(label) main::@return
|
||||||
(byte*) main::screen
|
(byte*) main::screen
|
||||||
@ -159,58 +146,6 @@ INITIAL SSA SYMBOL TABLE
|
|||||||
Culled Empty Block (label) @2
|
Culled Empty Block (label) @2
|
||||||
Succesful SSA optimization Pass2CullEmptyBlocks
|
Succesful SSA optimization Pass2CullEmptyBlocks
|
||||||
CONTROL FLOW GRAPH
|
CONTROL FLOW GRAPH
|
||||||
@begin: scope:[] from
|
|
||||||
(byte*) BGCOL#0 ← ((byte*)) (word) 53281
|
|
||||||
(byte) RED#0 ← (byte/signed byte/word/signed word) 2
|
|
||||||
to:@1
|
|
||||||
main: scope:[main] from @1
|
|
||||||
(byte*) BGCOL#1 ← phi( @1/(byte*) BGCOL#2 )
|
|
||||||
(byte) RED#1 ← phi( @1/(byte) RED#2 )
|
|
||||||
(byte*) main::screen#0 ← ((byte*)) (word/signed word) 1024
|
|
||||||
*((byte*) main::screen#0) ← (byte/signed byte/word/signed word) 1
|
|
||||||
*((byte*) BGCOL#1) ← (byte) RED#1
|
|
||||||
to:main::@return
|
|
||||||
main::@return: scope:[main] from main
|
|
||||||
return
|
|
||||||
to:@return
|
|
||||||
@1: scope:[] from @begin
|
|
||||||
(byte*) BGCOL#2 ← phi( @begin/(byte*) BGCOL#0 )
|
|
||||||
(byte) RED#2 ← phi( @begin/(byte) RED#0 )
|
|
||||||
call main param-assignment
|
|
||||||
to:@end
|
|
||||||
@end: scope:[] from @1
|
|
||||||
|
|
||||||
Not aliassing across scopes: RED#1 RED#2
|
|
||||||
Not aliassing across scopes: BGCOL#1 BGCOL#2
|
|
||||||
Alias (byte) RED#0 = (byte) RED#2
|
|
||||||
Alias (byte*) BGCOL#0 = (byte*) BGCOL#2
|
|
||||||
Succesful SSA optimization Pass2AliasElimination
|
|
||||||
CONTROL FLOW GRAPH
|
|
||||||
@begin: scope:[] from
|
|
||||||
(byte*) BGCOL#0 ← ((byte*)) (word) 53281
|
|
||||||
(byte) RED#0 ← (byte/signed byte/word/signed word) 2
|
|
||||||
to:@1
|
|
||||||
main: scope:[main] from @1
|
|
||||||
(byte*) BGCOL#1 ← phi( @1/(byte*) BGCOL#0 )
|
|
||||||
(byte) RED#1 ← phi( @1/(byte) RED#0 )
|
|
||||||
(byte*) main::screen#0 ← ((byte*)) (word/signed word) 1024
|
|
||||||
*((byte*) main::screen#0) ← (byte/signed byte/word/signed word) 1
|
|
||||||
*((byte*) BGCOL#1) ← (byte) RED#1
|
|
||||||
to:main::@return
|
|
||||||
main::@return: scope:[main] from main
|
|
||||||
return
|
|
||||||
to:@return
|
|
||||||
@1: scope:[] from @begin
|
|
||||||
call main param-assignment
|
|
||||||
to:@end
|
|
||||||
@end: scope:[] from @1
|
|
||||||
|
|
||||||
Not aliassing across scopes: RED#1 RED#0
|
|
||||||
Not aliassing across scopes: BGCOL#1 BGCOL#0
|
|
||||||
Redundant Phi (byte) RED#1 (byte) RED#0
|
|
||||||
Redundant Phi (byte*) BGCOL#1 (byte*) BGCOL#0
|
|
||||||
Succesful SSA optimization Pass2RedundantPhiElimination
|
|
||||||
CONTROL FLOW GRAPH
|
|
||||||
@begin: scope:[] from
|
@begin: scope:[] from
|
||||||
(byte*) BGCOL#0 ← ((byte*)) (word) 53281
|
(byte*) BGCOL#0 ← ((byte*)) (word) 53281
|
||||||
(byte) RED#0 ← (byte/signed byte/word/signed word) 2
|
(byte) RED#0 ← (byte/signed byte/word/signed word) 2
|
||||||
|
@ -284,8 +284,6 @@ s::@return: scope:[s] from s
|
|||||||
to:@end
|
to:@end
|
||||||
@end: scope:[] from @3
|
@end: scope:[] from @3
|
||||||
|
|
||||||
Completing Phi functions...
|
|
||||||
Completing Phi functions...
|
|
||||||
Completing Phi functions...
|
Completing Phi functions...
|
||||||
Completing Phi functions...
|
Completing Phi functions...
|
||||||
CONTROL FLOW GRAPH SSA
|
CONTROL FLOW GRAPH SSA
|
||||||
@ -295,14 +293,12 @@ CONTROL FLOW GRAPH SSA
|
|||||||
(byte) b#0 ← (byte~) $0
|
(byte) b#0 ← (byte~) $0
|
||||||
to:@2
|
to:@2
|
||||||
main: scope:[main] from @2
|
main: scope:[main] from @2
|
||||||
(byte*) SCREEN#3 ← phi( @2/(byte*) SCREEN#4 )
|
|
||||||
(byte) b#13 ← phi( @2/(byte) b#14 )
|
(byte) b#13 ← phi( @2/(byte) b#14 )
|
||||||
(byte) main::col#0 ← (byte/signed byte/word/signed word) 2
|
(byte) main::col#0 ← (byte/signed byte/word/signed word) 2
|
||||||
(byte*) main::COLS#0 ← ((byte*)) (word) 55296
|
(byte*) main::COLS#0 ← ((byte*)) (word) 55296
|
||||||
(byte) s::return#0 ← call s param-assignment
|
(byte) s::return#0 ← call s param-assignment
|
||||||
to:main::@3
|
to:main::@3
|
||||||
main::@3: scope:[main] from main
|
main::@3: scope:[main] from main
|
||||||
(byte*) SCREEN#2 ← phi( main/(byte*) SCREEN#3 )
|
|
||||||
(byte*) main::COLS#2 ← phi( main/(byte*) main::COLS#0 )
|
(byte*) main::COLS#2 ← phi( main/(byte*) main::COLS#0 )
|
||||||
(byte) main::col#2 ← phi( main/(byte) main::col#0 )
|
(byte) main::col#2 ← phi( main/(byte) main::col#0 )
|
||||||
(byte) b#7 ← phi( main/(byte) b#13 )
|
(byte) b#7 ← phi( main/(byte) b#13 )
|
||||||
@ -311,13 +307,12 @@ main::@3: scope:[main] from main
|
|||||||
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
||||||
to:main::@1
|
to:main::@1
|
||||||
main::@1: scope:[main] from main::@1 main::@3
|
main::@1: scope:[main] from main::@1 main::@3
|
||||||
(byte*) SCREEN#1 ← phi( main::@1/(byte*) SCREEN#1 main::@3/(byte*) SCREEN#2 )
|
|
||||||
(byte) b#8 ← phi( main::@1/(byte) b#8 main::@3/(byte) b#2 )
|
(byte) b#8 ← phi( main::@1/(byte) b#8 main::@3/(byte) b#2 )
|
||||||
(byte) main::i#2 ← phi( main::@1/(byte) main::i#1 main::@3/(byte) main::i#0 )
|
(byte) main::i#2 ← phi( main::@1/(byte) main::i#1 main::@3/(byte) main::i#0 )
|
||||||
(byte*) main::COLS#1 ← phi( main::@1/(byte*) main::COLS#1 main::@3/(byte*) main::COLS#2 )
|
(byte*) main::COLS#1 ← phi( main::@1/(byte*) main::COLS#1 main::@3/(byte*) main::COLS#2 )
|
||||||
(byte) main::col#1 ← phi( main::@1/(byte) main::col#1 main::@3/(byte) main::col#2 )
|
(byte) main::col#1 ← phi( main::@1/(byte) main::col#1 main::@3/(byte) main::col#2 )
|
||||||
*((byte*) main::COLS#1 + (byte) main::i#2) ← (byte) main::col#1
|
*((byte*) main::COLS#1 + (byte) main::i#2) ← (byte) main::col#1
|
||||||
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte) b#8
|
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte) b#8
|
||||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||||
(boolean~) main::$8 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
|
(boolean~) main::$8 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
|
||||||
if((boolean~) main::$8) goto main::@1
|
if((boolean~) main::$8) goto main::@1
|
||||||
@ -340,7 +335,6 @@ s::@return: scope:[s] from s
|
|||||||
return (byte) s::return#2
|
return (byte) s::return#2
|
||||||
to:@return
|
to:@return
|
||||||
@2: scope:[] from @begin
|
@2: scope:[] from @begin
|
||||||
(byte*) SCREEN#4 ← phi( @begin/(byte*) SCREEN#0 )
|
|
||||||
(byte) b#14 ← phi( @begin/(byte) b#0 )
|
(byte) b#14 ← phi( @begin/(byte) b#0 )
|
||||||
call main param-assignment
|
call main param-assignment
|
||||||
to:@3
|
to:@3
|
||||||
@ -357,7 +351,6 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN
|
|||||||
(byte) b#0 ← (byte~) $0
|
(byte) b#0 ← (byte~) $0
|
||||||
to:@2
|
to:@2
|
||||||
main: scope:[main] from @2
|
main: scope:[main] from @2
|
||||||
(byte*) SCREEN#3 ← phi( @2/(byte*) SCREEN#4 )
|
|
||||||
(byte) b#13 ← phi( @2/(byte) b#14 )
|
(byte) b#13 ← phi( @2/(byte) b#14 )
|
||||||
(byte) main::col#0 ← (byte/signed byte/word/signed word) 2
|
(byte) main::col#0 ← (byte/signed byte/word/signed word) 2
|
||||||
(byte*) main::COLS#0 ← ((byte*)) (word) 55296
|
(byte*) main::COLS#0 ← ((byte*)) (word) 55296
|
||||||
@ -365,7 +358,6 @@ main: scope:[main] from @2
|
|||||||
(byte) s::return#0 ← (byte) s::return#2
|
(byte) s::return#0 ← (byte) s::return#2
|
||||||
to:main::@3
|
to:main::@3
|
||||||
main::@3: scope:[main] from main
|
main::@3: scope:[main] from main
|
||||||
(byte*) SCREEN#2 ← phi( main/(byte*) SCREEN#3 )
|
|
||||||
(byte*) main::COLS#2 ← phi( main/(byte*) main::COLS#0 )
|
(byte*) main::COLS#2 ← phi( main/(byte*) main::COLS#0 )
|
||||||
(byte) main::col#2 ← phi( main/(byte) main::col#0 )
|
(byte) main::col#2 ← phi( main/(byte) main::col#0 )
|
||||||
(byte) b#7 ← phi( main/(byte) b#5 )
|
(byte) b#7 ← phi( main/(byte) b#5 )
|
||||||
@ -374,13 +366,12 @@ main::@3: scope:[main] from main
|
|||||||
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
||||||
to:main::@1
|
to:main::@1
|
||||||
main::@1: scope:[main] from main::@1 main::@3
|
main::@1: scope:[main] from main::@1 main::@3
|
||||||
(byte*) SCREEN#1 ← phi( main::@1/(byte*) SCREEN#1 main::@3/(byte*) SCREEN#2 )
|
|
||||||
(byte) b#8 ← phi( main::@1/(byte) b#8 main::@3/(byte) b#2 )
|
(byte) b#8 ← phi( main::@1/(byte) b#8 main::@3/(byte) b#2 )
|
||||||
(byte) main::i#2 ← phi( main::@1/(byte) main::i#1 main::@3/(byte) main::i#0 )
|
(byte) main::i#2 ← phi( main::@1/(byte) main::i#1 main::@3/(byte) main::i#0 )
|
||||||
(byte*) main::COLS#1 ← phi( main::@1/(byte*) main::COLS#1 main::@3/(byte*) main::COLS#2 )
|
(byte*) main::COLS#1 ← phi( main::@1/(byte*) main::COLS#1 main::@3/(byte*) main::COLS#2 )
|
||||||
(byte) main::col#1 ← phi( main::@1/(byte) main::col#1 main::@3/(byte) main::col#2 )
|
(byte) main::col#1 ← phi( main::@1/(byte) main::col#1 main::@3/(byte) main::col#2 )
|
||||||
*((byte*) main::COLS#1 + (byte) main::i#2) ← (byte) main::col#1
|
*((byte*) main::COLS#1 + (byte) main::i#2) ← (byte) main::col#1
|
||||||
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte) b#8
|
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte) b#8
|
||||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||||
(boolean~) main::$8 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
|
(boolean~) main::$8 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
|
||||||
if((boolean~) main::$8) goto main::@1
|
if((boolean~) main::$8) goto main::@1
|
||||||
@ -403,7 +394,6 @@ s::@return: scope:[s] from s
|
|||||||
return
|
return
|
||||||
to:@return
|
to:@return
|
||||||
@2: scope:[] from @begin
|
@2: scope:[] from @begin
|
||||||
(byte*) SCREEN#4 ← phi( @begin/(byte*) SCREEN#0 )
|
|
||||||
(byte) b#14 ← phi( @begin/(byte) b#0 )
|
(byte) b#14 ← phi( @begin/(byte) b#0 )
|
||||||
call main param-assignment
|
call main param-assignment
|
||||||
to:@3
|
to:@3
|
||||||
@ -421,10 +411,6 @@ INITIAL SSA SYMBOL TABLE
|
|||||||
(label) @end
|
(label) @end
|
||||||
(byte*) SCREEN
|
(byte*) SCREEN
|
||||||
(byte*) SCREEN#0
|
(byte*) SCREEN#0
|
||||||
(byte*) SCREEN#1
|
|
||||||
(byte*) SCREEN#2
|
|
||||||
(byte*) SCREEN#3
|
|
||||||
(byte*) SCREEN#4
|
|
||||||
(byte) b
|
(byte) b
|
||||||
(byte) b#0
|
(byte) b#0
|
||||||
(byte) b#1
|
(byte) b#1
|
||||||
@ -467,24 +453,20 @@ INITIAL SSA SYMBOL TABLE
|
|||||||
(byte) s::return#3
|
(byte) s::return#3
|
||||||
|
|
||||||
Not aliassing across scopes: b#13 b#14
|
Not aliassing across scopes: b#13 b#14
|
||||||
Not aliassing across scopes: SCREEN#3 SCREEN#4
|
|
||||||
Not aliassing across scopes: s::return#0 s::return#2
|
Not aliassing across scopes: s::return#0 s::return#2
|
||||||
Not aliassing across scopes: b#7 b#5
|
Not aliassing across scopes: b#7 b#5
|
||||||
Not aliassing identity: main::col#1 main::col#1
|
Not aliassing identity: main::col#1 main::col#1
|
||||||
Not aliassing identity: main::COLS#1 main::COLS#1
|
Not aliassing identity: main::COLS#1 main::COLS#1
|
||||||
Not aliassing identity: b#8 b#8
|
Not aliassing identity: b#8 b#8
|
||||||
Not aliassing identity: SCREEN#1 SCREEN#1
|
|
||||||
Not aliassing across scopes: b#10 b#13
|
Not aliassing across scopes: b#10 b#13
|
||||||
Not aliassing across scopes: b#12 b#3
|
Not aliassing across scopes: b#12 b#3
|
||||||
Alias (byte) b#0 = (byte~) $0 (byte) b#14
|
Alias (byte) b#0 = (byte~) $0 (byte) b#14
|
||||||
Alias (byte) main::col#0 = (byte) main::col#2
|
Alias (byte) main::col#0 = (byte) main::col#2
|
||||||
Alias (byte*) main::COLS#0 = (byte*) main::COLS#2
|
Alias (byte*) main::COLS#0 = (byte*) main::COLS#2
|
||||||
Alias (byte*) SCREEN#2 = (byte*) SCREEN#3
|
|
||||||
Alias (byte) b#1 = (byte) b#7
|
Alias (byte) b#1 = (byte) b#7
|
||||||
Alias (byte) b#3 = (byte) b#9 (byte) b#8
|
Alias (byte) b#3 = (byte) b#9 (byte) b#8
|
||||||
Alias (byte) s::return#1 = (byte) s::return#3 (byte) s::return#2
|
Alias (byte) s::return#1 = (byte) s::return#3 (byte) s::return#2
|
||||||
Alias (byte) b#11 = (byte) b#4 (byte) b#5
|
Alias (byte) b#11 = (byte) b#4 (byte) b#5
|
||||||
Alias (byte*) SCREEN#0 = (byte*) SCREEN#4
|
|
||||||
Alias (byte) b#12 = (byte) b#6
|
Alias (byte) b#12 = (byte) b#6
|
||||||
Succesful SSA optimization Pass2AliasElimination
|
Succesful SSA optimization Pass2AliasElimination
|
||||||
CONTROL FLOW GRAPH
|
CONTROL FLOW GRAPH
|
||||||
@ -493,7 +475,6 @@ CONTROL FLOW GRAPH
|
|||||||
(byte) b#0 ← (byte/signed byte/word/signed word) 2 >> (byte/signed byte/word/signed word) 1
|
(byte) b#0 ← (byte/signed byte/word/signed word) 2 >> (byte/signed byte/word/signed word) 1
|
||||||
to:@2
|
to:@2
|
||||||
main: scope:[main] from @2
|
main: scope:[main] from @2
|
||||||
(byte*) SCREEN#2 ← phi( @2/(byte*) SCREEN#0 )
|
|
||||||
(byte) b#13 ← phi( @2/(byte) b#0 )
|
(byte) b#13 ← phi( @2/(byte) b#0 )
|
||||||
(byte) main::col#0 ← (byte/signed byte/word/signed word) 2
|
(byte) main::col#0 ← (byte/signed byte/word/signed word) 2
|
||||||
(byte*) main::COLS#0 ← ((byte*)) (word) 55296
|
(byte*) main::COLS#0 ← ((byte*)) (word) 55296
|
||||||
@ -506,13 +487,12 @@ main::@3: scope:[main] from main
|
|||||||
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
||||||
to:main::@1
|
to:main::@1
|
||||||
main::@1: scope:[main] from main::@1 main::@3
|
main::@1: scope:[main] from main::@1 main::@3
|
||||||
(byte*) SCREEN#1 ← phi( main::@1/(byte*) SCREEN#1 main::@3/(byte*) SCREEN#2 )
|
|
||||||
(byte) b#3 ← phi( main::@1/(byte) b#3 main::@3/(byte) b#2 )
|
(byte) b#3 ← phi( main::@1/(byte) b#3 main::@3/(byte) b#2 )
|
||||||
(byte) main::i#2 ← phi( main::@1/(byte) main::i#1 main::@3/(byte) main::i#0 )
|
(byte) main::i#2 ← phi( main::@1/(byte) main::i#1 main::@3/(byte) main::i#0 )
|
||||||
(byte*) main::COLS#1 ← phi( main::@1/(byte*) main::COLS#1 main::@3/(byte*) main::COLS#0 )
|
(byte*) main::COLS#1 ← phi( main::@1/(byte*) main::COLS#1 main::@3/(byte*) main::COLS#0 )
|
||||||
(byte) main::col#1 ← phi( main::@1/(byte) main::col#1 main::@3/(byte) main::col#0 )
|
(byte) main::col#1 ← phi( main::@1/(byte) main::col#1 main::@3/(byte) main::col#0 )
|
||||||
*((byte*) main::COLS#1 + (byte) main::i#2) ← (byte) main::col#1
|
*((byte*) main::COLS#1 + (byte) main::i#2) ← (byte) main::col#1
|
||||||
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte) b#3
|
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte) b#3
|
||||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||||
(boolean~) main::$8 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
|
(boolean~) main::$8 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
|
||||||
if((boolean~) main::$8) goto main::@1
|
if((boolean~) main::$8) goto main::@1
|
||||||
@ -537,19 +517,16 @@ s::@return: scope:[s] from s
|
|||||||
@end: scope:[] from @3
|
@end: scope:[] from @3
|
||||||
|
|
||||||
Not aliassing across scopes: b#13 b#0
|
Not aliassing across scopes: b#13 b#0
|
||||||
Not aliassing across scopes: SCREEN#2 SCREEN#0
|
|
||||||
Not aliassing across scopes: s::return#0 s::return#1
|
Not aliassing across scopes: s::return#0 s::return#1
|
||||||
Not aliassing across scopes: b#1 b#11
|
Not aliassing across scopes: b#1 b#11
|
||||||
Not aliassing identity: main::col#1 main::col#1
|
Not aliassing identity: main::col#1 main::col#1
|
||||||
Not aliassing identity: main::COLS#1 main::COLS#1
|
Not aliassing identity: main::COLS#1 main::COLS#1
|
||||||
Not aliassing identity: b#3 b#3
|
Not aliassing identity: b#3 b#3
|
||||||
Not aliassing identity: SCREEN#1 SCREEN#1
|
|
||||||
Not aliassing across scopes: b#10 b#13
|
Not aliassing across scopes: b#10 b#13
|
||||||
Not aliassing across scopes: b#12 b#3
|
Not aliassing across scopes: b#12 b#3
|
||||||
Self Phi Eliminated (byte) main::col#1
|
Self Phi Eliminated (byte) main::col#1
|
||||||
Self Phi Eliminated (byte*) main::COLS#1
|
Self Phi Eliminated (byte*) main::COLS#1
|
||||||
Self Phi Eliminated (byte) b#3
|
Self Phi Eliminated (byte) b#3
|
||||||
Self Phi Eliminated (byte*) SCREEN#1
|
|
||||||
Succesful SSA optimization Pass2SelfPhiElimination
|
Succesful SSA optimization Pass2SelfPhiElimination
|
||||||
CONTROL FLOW GRAPH
|
CONTROL FLOW GRAPH
|
||||||
@begin: scope:[] from
|
@begin: scope:[] from
|
||||||
@ -557,7 +534,6 @@ CONTROL FLOW GRAPH
|
|||||||
(byte) b#0 ← (byte/signed byte/word/signed word) 2 >> (byte/signed byte/word/signed word) 1
|
(byte) b#0 ← (byte/signed byte/word/signed word) 2 >> (byte/signed byte/word/signed word) 1
|
||||||
to:@2
|
to:@2
|
||||||
main: scope:[main] from @2
|
main: scope:[main] from @2
|
||||||
(byte*) SCREEN#2 ← phi( @2/(byte*) SCREEN#0 )
|
|
||||||
(byte) b#13 ← phi( @2/(byte) b#0 )
|
(byte) b#13 ← phi( @2/(byte) b#0 )
|
||||||
(byte) main::col#0 ← (byte/signed byte/word/signed word) 2
|
(byte) main::col#0 ← (byte/signed byte/word/signed word) 2
|
||||||
(byte*) main::COLS#0 ← ((byte*)) (word) 55296
|
(byte*) main::COLS#0 ← ((byte*)) (word) 55296
|
||||||
@ -570,13 +546,12 @@ main::@3: scope:[main] from main
|
|||||||
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
||||||
to:main::@1
|
to:main::@1
|
||||||
main::@1: scope:[main] from main::@1 main::@3
|
main::@1: scope:[main] from main::@1 main::@3
|
||||||
(byte*) SCREEN#1 ← phi( main::@3/(byte*) SCREEN#2 )
|
|
||||||
(byte) b#3 ← phi( main::@3/(byte) b#2 )
|
(byte) b#3 ← phi( main::@3/(byte) b#2 )
|
||||||
(byte) main::i#2 ← phi( main::@1/(byte) main::i#1 main::@3/(byte) main::i#0 )
|
(byte) main::i#2 ← phi( main::@1/(byte) main::i#1 main::@3/(byte) main::i#0 )
|
||||||
(byte*) main::COLS#1 ← phi( main::@3/(byte*) main::COLS#0 )
|
(byte*) main::COLS#1 ← phi( main::@3/(byte*) main::COLS#0 )
|
||||||
(byte) main::col#1 ← phi( main::@3/(byte) main::col#0 )
|
(byte) main::col#1 ← phi( main::@3/(byte) main::col#0 )
|
||||||
*((byte*) main::COLS#1 + (byte) main::i#2) ← (byte) main::col#1
|
*((byte*) main::COLS#1 + (byte) main::i#2) ← (byte) main::col#1
|
||||||
*((byte*) SCREEN#1 + (byte) main::i#2) ← (byte) b#3
|
*((byte*) SCREEN#0 + (byte) main::i#2) ← (byte) b#3
|
||||||
(byte) main::i#1 ← ++ (byte) main::i#2
|
(byte) main::i#1 ← ++ (byte) main::i#2
|
||||||
(boolean~) main::$8 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
|
(boolean~) main::$8 ← (byte) main::i#1 != (byte/signed byte/word/signed word) 101
|
||||||
if((boolean~) main::$8) goto main::@1
|
if((boolean~) main::$8) goto main::@1
|
||||||
@ -601,12 +576,10 @@ s::@return: scope:[s] from s
|
|||||||
@end: scope:[] from @3
|
@end: scope:[] from @3
|
||||||
|
|
||||||
Redundant Phi (byte) b#13 (byte) b#0
|
Redundant Phi (byte) b#13 (byte) b#0
|
||||||
Redundant Phi (byte*) SCREEN#2 (byte*) SCREEN#0
|
|
||||||
Redundant Phi (byte) b#1 (byte) b#11
|
Redundant Phi (byte) b#1 (byte) b#11
|
||||||
Redundant Phi (byte) main::col#1 (byte) main::col#0
|
Redundant Phi (byte) main::col#1 (byte) main::col#0
|
||||||
Redundant Phi (byte*) main::COLS#1 (byte*) main::COLS#0
|
Redundant Phi (byte*) main::COLS#1 (byte*) main::COLS#0
|
||||||
Redundant Phi (byte) b#3 (byte) b#2
|
Redundant Phi (byte) b#3 (byte) b#2
|
||||||
Redundant Phi (byte*) SCREEN#1 (byte*) SCREEN#2
|
|
||||||
Redundant Phi (byte) b#10 (byte) b#13
|
Redundant Phi (byte) b#10 (byte) b#13
|
||||||
Redundant Phi (byte) b#12 (byte) b#3
|
Redundant Phi (byte) b#12 (byte) b#3
|
||||||
Succesful SSA optimization Pass2RedundantPhiElimination
|
Succesful SSA optimization Pass2RedundantPhiElimination
|
||||||
|
Loading…
Reference in New Issue
Block a user