mirror of
https://gitlab.com/camelot/kickc.git
synced 2025-02-21 22:29:07 +00:00
Looking at function calls
This commit is contained in:
parent
4aa00d4536
commit
2dedf8263b
@ -153,7 +153,7 @@ public class Pass1GenerateSingleStaticAssignmentForm {
|
||||
previousSymbol = predecessorMap.get(unversioned);
|
||||
}
|
||||
if (previousSymbol == null) {
|
||||
// No previous symbol found in predecessor block. Look in new a phi functions.
|
||||
// No previous symbol found in predecessor block. Look in new phi functions.
|
||||
Map<VariableUnversioned, VariableVersion> predecessorNewPhis = newPhis.get(predecessor);
|
||||
if (predecessorNewPhis == null) {
|
||||
predecessorNewPhis = new HashMap<>();
|
||||
|
@ -13,7 +13,7 @@ import java.util.List;
|
||||
/** Test my KickC Grammar */
|
||||
public class Main {
|
||||
public static void main(String[] args) throws IOException {
|
||||
final String fileName = "src/dk/camelot64/kickc/test/fibmem.kc";
|
||||
final String fileName = "src/dk/camelot64/kickc/test/selfassign.kc";
|
||||
final CharStream input = CharStreams.fromFileName(fileName);
|
||||
System.out.println(input.toString());
|
||||
KickCLexer lexer = new KickCLexer(input);
|
||||
|
143
src/dk/camelot64/kickc/test/fct-inc.txt
Normal file
143
src/dk/camelot64/kickc/test/fct-inc.txt
Normal file
@ -0,0 +1,143 @@
|
||||
byte i = 5;
|
||||
a = inc(3);
|
||||
a = inc(a);
|
||||
a = a + i;
|
||||
|
||||
byte inc(byte a) {
|
||||
i = i + 1;
|
||||
return a + i;
|
||||
}
|
||||
|
||||
// Not committed to a specific parameter transfer style (non SSA)
|
||||
@BEGIN:
|
||||
(byte) i := 5
|
||||
(byte) a := call INC 3
|
||||
(byte) a := call INC a
|
||||
(byte) a := a + i
|
||||
to: @END
|
||||
INC:
|
||||
(byte) param INC.a
|
||||
(byte) i := i + 1
|
||||
(byte§) $1 := INC.a + i
|
||||
return (byte) $1
|
||||
to: @RETURN
|
||||
|
||||
// Variable/Register parameter/return transfer (non SSA)
|
||||
@BEGIN:
|
||||
(byte) i := 5
|
||||
(byte) INC.a := 3
|
||||
(byte) a := call INC
|
||||
to: @1
|
||||
@1:
|
||||
(byte) INC.a := a
|
||||
(byte) a := call INC
|
||||
to: @2
|
||||
@2:
|
||||
(byte§) a := a + i
|
||||
to: @END
|
||||
INC:
|
||||
(byte) param INC.a
|
||||
(byte) i := i + 1
|
||||
(byte§) $1 := INC.a + i
|
||||
(byte)return $1
|
||||
to: @RETURN
|
||||
|
||||
// Variable/Register parameter/return transfer (SSA)
|
||||
@BEGIN:
|
||||
(byte) i#0 := 5
|
||||
(byte) INC.a#0 := 3
|
||||
call INC
|
||||
(byte) a#0 := INC.return#0
|
||||
(byte) i#3 := INC.i#1
|
||||
to: @1
|
||||
@1:
|
||||
(byte) i#2 = phi( @BEGIN/i#3)
|
||||
(byte§) a#1 := phi(@BEGIN/a#0)
|
||||
(byte) INC.a#1 := a#1
|
||||
call INC
|
||||
(byte) a#1 := INC.return#0
|
||||
(byte) i#4 := INC.i#1
|
||||
to @2
|
||||
@2:
|
||||
(byte) i#1 = phi( @1/i#4)
|
||||
(byte) a#2 = phi( @1/a#1)
|
||||
(byte§) $2 := a#2 + i#1
|
||||
(byte§) a#2 := $2
|
||||
to: @END
|
||||
INC: from @BEGIN @1
|
||||
(byte) param INC.a
|
||||
(byte) INC.a#2 = phi( @BEGIN/INC.a#0 @1/INC.a#1)
|
||||
(byte) INC.i#0 = phi( @BEGIN/i#0 @1/i#2)
|
||||
(byte) INC.i#1 := INC.i#0 + INC.1#0;
|
||||
(byte§) $1 := INC.a#2 + INC.i#1;
|
||||
(byte) INC.return#0 := $1
|
||||
(byte) return INC.return#0
|
||||
to: @RETURN
|
||||
|
||||
// Variable/Register parameter/return transfer (SSA) optimized
|
||||
@BEGIN:
|
||||
call INC
|
||||
to: @1
|
||||
@1:
|
||||
call INC
|
||||
to @2
|
||||
@2:
|
||||
(byte§) a#2 := INC.return#0 + INC.i#1
|
||||
to: @END
|
||||
INC: from @BEGIN @1
|
||||
(byte) INC.a#2 = phi( @BEGIN/3 @1/INC.return#0)
|
||||
(byte) INC.i#0 = phi( @BEGIN/5 @1/INC.i#1)
|
||||
(byte) INC.i#1 := INC.i#0 + 1;
|
||||
(byte) INC.return#0 := INC.a#2 + INC.i#1
|
||||
to: @RETURN
|
||||
|
||||
// Inline call (non SSA)
|
||||
@BEGIN:
|
||||
(byte) i := 5
|
||||
to: INC@1
|
||||
INC@1:
|
||||
(byte) INC.a := 3
|
||||
(byte) i := i + 1
|
||||
(byte§) $2 := INC.a + i
|
||||
(byte) a := (byte) $2
|
||||
to: INC@2
|
||||
INC@2:
|
||||
(byte) INC.a := a
|
||||
(byte) i := i + 1
|
||||
(byte§) $3 := INC.a + i
|
||||
(byte) a := (byte) $3
|
||||
to: @1
|
||||
@1:
|
||||
(byte) a := a + i;
|
||||
to: @END
|
||||
|
||||
// Inline call (SSA)
|
||||
@BEGIN:
|
||||
(byte) i#0 := 5
|
||||
to: INC@1
|
||||
INC@1:
|
||||
(byte) i#5 := phi(@BEGIN/i#0)
|
||||
(byte) INC.a#0 := 3
|
||||
(byte) i#1 := i#5 + 1
|
||||
(byte§) $2 := INC.a#0 + i#1
|
||||
(byte) a#0 := (byte) $2
|
||||
to: INC@2
|
||||
INC@2:
|
||||
(byte) i#4 := phi(INC@2/i#1)
|
||||
(byte) a#4 := phi(INC@1/a#0)
|
||||
(byte) INC.a#1 := a#4
|
||||
(byte) i#2 := i#4 + 1
|
||||
(byte§) $3 := INC.a#1 + i#2
|
||||
(byte) a#1 := (byte) $3
|
||||
to: @1
|
||||
@1:
|
||||
(byte) i#3 := phi(INC@2/i#2)
|
||||
(byte) a#3 := phi(INC@2/a#1)
|
||||
(byte) a#2 := a#3 + i#3;
|
||||
to: @END
|
||||
|
||||
// Inline call (SSA) - optimized
|
||||
@BEGIN:
|
||||
(byte) i#3 := 7
|
||||
(byte) a#2 := 23;
|
||||
to: @END
|
116
src/dk/camelot64/kickc/test/fct-sum.txt
Normal file
116
src/dk/camelot64/kickc/test/fct-sum.txt
Normal file
@ -0,0 +1,116 @@
|
||||
byte a = 12;
|
||||
byte s = sum(5,a);
|
||||
byte a = a+s;
|
||||
byte s2 = sum(s, a);
|
||||
|
||||
byte sum(byte b1, byte b2) {
|
||||
return b1+b2;
|
||||
}
|
||||
|
||||
|
||||
CONTROL FLOW GRAPH:
|
||||
|
||||
// Not committed to a specific parameter transfer style (non SSA)
|
||||
@BEGIN
|
||||
(byte) a := 12
|
||||
(byte) s := call SUM 5 a
|
||||
(byte§) $2 := a + s
|
||||
(byte§) a := $2
|
||||
(byte) s2 := call SUM s a
|
||||
to: @END
|
||||
SUM:
|
||||
param (byte) b1
|
||||
param (byte) b2
|
||||
(byte*) $1 := b1 + b2
|
||||
return (byte) $1
|
||||
to:
|
||||
|
||||
// Not committed to a specific parameter transfer style (SSA)
|
||||
@BEGIN
|
||||
(byte) a#0 := 12
|
||||
(byte) s#0 := call SUM 5 a#0
|
||||
(byte§) $2 := a#0 + s#0
|
||||
(byte§) a#1 := $2
|
||||
(byte) s2#0 := call SUM s#0 a#1
|
||||
to: @END
|
||||
SUM:
|
||||
param (byte) b1#0
|
||||
param (byte) b2#0
|
||||
(byte*) $1 := b1#0 + b2#0
|
||||
return (byte) $1
|
||||
to: @RETURN
|
||||
|
||||
|
||||
// Variable based parameter & return transfer (non SSA)
|
||||
@BEGIN:
|
||||
(byte) a := 12
|
||||
(byte) SUM.b2 := a
|
||||
(byte) SUM.b1 := 5
|
||||
(byte) SUM.return = call SUM
|
||||
to @1
|
||||
@1: from @BEGIN
|
||||
(byte) s := SUM.return
|
||||
(byte*) $2 := a + s
|
||||
(byte*) a := a + s
|
||||
(byte) SUM.b2 := a
|
||||
(byte) SUM.b1 := s
|
||||
(byte) SUM.return := call SUM
|
||||
to: @2
|
||||
@2: from @1
|
||||
(byte) s2 := SUM.return
|
||||
to: @END
|
||||
SUM: from: @BEGIN, @1
|
||||
(byte§) $1 := SUM.b1 + SUM.b2
|
||||
(byte) SUM.return := $1
|
||||
return SUM.return
|
||||
to: @RETURN
|
||||
|
||||
// Variable based parameter transfer & return (SSA)
|
||||
@BEGIN:
|
||||
(byte) a#0 := 12
|
||||
(byte) SUM.b2#0 := a#0
|
||||
(byte) SUM.b1#0 := 5
|
||||
call SUM
|
||||
(byte) SUM.return#0 = SUM.return#4
|
||||
to @1
|
||||
@1: from @BEGIN
|
||||
(byte) SUM.return#1 = phi( @BEGIN/SUM.return#0)
|
||||
(byte) a#1 = phi( @BEGIN/a#0)
|
||||
(byte) s#0 := SUM.return#1
|
||||
(byte*) $2 := a#1 + s#0
|
||||
(byte*) a#2 := $2
|
||||
(byte) SUM.b2#1 := a#2
|
||||
(byte) SUM.b1#1 := s#0
|
||||
call SUM
|
||||
(byte) SUM.return#2 := SUM.return#4
|
||||
to: @2
|
||||
@2: from @1
|
||||
(byte) SUM.return#3 = phi( @1/SUM.return#2)
|
||||
(byte) s2#0 := SUM.return#3
|
||||
to: @END
|
||||
SUM: from: @BEGIN, @1
|
||||
(byte) SUM.b1#2 := phi(@BEGIN/SUM.b1#0 @1/SUM.b1#1)
|
||||
(byte) SUM.b2#2 := phi(@BEGIN/SUM.b2#0 @1/SUM.b2#1)
|
||||
(byte§) $1 := SUM.b1#2 + SUM.b2#2
|
||||
(byte) SUM.return#4 := $1
|
||||
return SUM.return#4
|
||||
to: @RETURN
|
||||
|
||||
// Variable based parameter transfer & return (SSA) - after optimizing
|
||||
@BEGIN:
|
||||
(byte) call SUM
|
||||
to @1
|
||||
@1: from @BEGIN
|
||||
(byte) SUM.b2#1 := a#0 + SUM.return#4
|
||||
(byte) call SUM
|
||||
to: @2
|
||||
@2: from @1
|
||||
(byte) s2#0 := SUM.return#4
|
||||
to: @END
|
||||
SUM: from: @BEGIN, @1
|
||||
(byte) SUM.b1#2 := phi(@BEGIN/5 @1/SUM.return#4)
|
||||
(byte) SUM.b2#2 := phi(@BEGIN/12 @1/SUM.b2#1)
|
||||
(byte§) $1 := SUM.b1#2 + SUM.b2#2
|
||||
(byte) SUM.return#4 := $1
|
||||
to: @RETURN
|
||||
|
4
src/dk/camelot64/kickc/test/selfassign.kc
Normal file
4
src/dk/camelot64/kickc/test/selfassign.kc
Normal file
@ -0,0 +1,4 @@
|
||||
byte a = 15;
|
||||
a = a;
|
||||
a = a;
|
||||
a = a;
|
Loading…
x
Reference in New Issue
Block a user