1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-06-03 07:29:37 +00:00

Looking at function calls

This commit is contained in:
jespergravgaard 2017-06-05 00:38:50 +02:00
parent 4aa00d4536
commit 2dedf8263b
5 changed files with 265 additions and 2 deletions

View File

@ -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<>();

View File

@ -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);

View 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

View 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

View File

@ -0,0 +1,4 @@
byte a = 15;
a = a;
a = a;
a = a;