Skip to content

Commit

Permalink
Черновое приведение кода к желаемой структуре (#263)
Browse files Browse the repository at this point in the history
Собственно, пример из issue теперь оптимизируется правильно. Однако,
корректировка внесена минимальными правками, обеспечивающими новое
поведение. Осталась масса костылей, вроде холодных вызовов в специализаторе.
Удаление костылей будет вынесено в отдельные коммиты, дабы упростить
понимание истории.

Специализатор теперь оптимизирует дерево за один проход снизу вверх.
Однако, «холодные» определения функций пока не поддерживаются.
  • Loading branch information
Mazdaywik committed Apr 12, 2020
1 parent 96fb33e commit 1e38bfc
Show file tree
Hide file tree
Showing 3 changed files with 129 additions and 108 deletions.
62 changes: 55 additions & 7 deletions src/compiler/OptTree-Drive.ref
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,6 @@ $ENTRY OptTree-Drive {
= <DriveInlineOptimizerTick (e.DriveInfo) e.AST s.Opt>;
}

/**
<OptTree-Drive-Finalize s.OptDrive (e.DriveInfo) e.AST> == e.AST^
*/
$ENTRY OptTree-Drive-Finalize {
s.OptDrive ((e.Names) e.Info) e.AST = e.AST;
}

/* Функция генерирует имена остаточных прогоняемых функций */

GenRemainderFuncNames {
Expand Down Expand Up @@ -594,3 +587,58 @@ RemainderFuncIncName {

e.Name = e.Name SUF '*' 1;
}

/**
<OptTree-Drive-CleanupColdCalls e.AST> == e.AST^
*/
$ENTRY OptTree-Drive-CleanupColdCalls {
e.AST
= <Map
{
(Function s.ScopeClass (e.Name) Sentences e.Body)
= (Function
s.ScopeClass (e.Name) Sentences <CleanupCold-Body e.Body>
);

t.OtherItem = t.OtherItem;
}
e.AST
>;
}

CleanupCold-Body {
e.Sentences = <Map &CleanupCold-Sentence e.Sentences>;
}

CleanupCold-Sentence {
((e.Pattern) e.Conditions (e.Result))
= (
(e.Pattern)
<Map
{
(Condition (e.Name) (e.Result^) (e.Pattern^))
= (Condition
(e.Name) (<CleanupCold-Result e.Result>) (e.Pattern)
);
}
e.Conditions
>
(<CleanupCold-Result e.Result>)
);
}

CleanupCold-Result {
e.Result = <Map &CleanupCold-Term e.Result>;
}

CleanupCold-Term {
(Brackets e.Expr) = (Brackets <CleanupCold-Result e.Expr>);

(ADT-Brackets (e.Name) e.Expr)
= (ADT-Brackets (e.Name) <CleanupCold-Result e.Expr>);

(CallBrackets e.Expr) = (CallBrackets <CleanupCold-Result e.Expr>);
(ColdCallBrackets e.Expr) = (CallBrackets <CleanupCold-Result e.Expr>);

t.OtherTerm = t.OtherTerm;
}
62 changes: 23 additions & 39 deletions src/compiler/OptTree-Spec.ref
Original file line number Diff line number Diff line change
Expand Up @@ -178,22 +178,13 @@ SpecResult {
и пытается выполнить специализацию для него
*/
SpecTerm {
(e.SpecInfo-B ((e.Name) e.Info) e.SpecInfo-E (e.NewFunctions))
(CallBrackets (Symbol Name e.Name) e.Expression)
, <IsColdArg e.Expression> : True
= <SpecCall (e.Name) e.Info (e.Expression)>
: (e.Info^) t.NewCall e.NewFunction
= (
e.SpecInfo-B ((e.Name) e.Info) e.SpecInfo-E
(e.NewFunctions e.NewFunction)
)
t.NewCall;

(e.SpecInfo (e.NewFunctions)) (CallBrackets (Symbol Name e.Name) e.Expression)
= <SpecResult (e.SpecInfo (e.NewFunctions)) e.Expression>
: (e.SpecInfo^ (e.NewFunctions^)) e.Expression^
= (e.SpecInfo (e.NewFunctions))
(CallBrackets (Symbol Name e.Name) e.Expression);
= <TrySpecCall
(e.SpecInfo (e.NewFunctions))
(CallBrackets (Symbol Name e.Name) e.Expression)
>;

(e.SpecInfo (e.NewFunctions)) (ClosureBrackects e.ClosureContent)
= <SpecResult (e.SpecInfo (e.NewFunctions)) e.ClosureContent>
Expand All @@ -214,6 +205,22 @@ SpecTerm {
= (e.SpecInfo (e.NewFunctions)) t.Other;
}

TrySpecCall {
(e.SpecInfo-B ((e.Name) e.Info) e.SpecInfo-E (e.NewFunctions))
(CallBrackets (Symbol Name e.Name) e.Expression)
= <SpecCall (e.Name) e.Info (e.Expression)>
: (e.Info^) t.NewCall e.NewFunction
= (
e.SpecInfo-B ((e.Name) e.Info) e.SpecInfo-E
(e.NewFunctions e.NewFunction)
)
t.NewCall;

(e.SpecInfo (e.NewFunctions)) (CallBrackets (Symbol Name e.Name) e.Expression)
= (e.SpecInfo (e.NewFunctions))
(CallBrackets (Symbol Name e.Name) e.Expression);
}

/**
<SpecCall
(e.Name) (e.SpecPattern) (e.Body)
Expand Down Expand Up @@ -700,11 +707,10 @@ Spec-PrepareConditions {
}

/**
<OptTree-Spec-Finalize s.OptSpec (e.SpecInfo) e.AST> == e.AST^
<OptTree-Spec-CleanupColdFunctions e.AST> == e.AST^
*/
$ENTRY OptTree-Spec-Finalize {
s.OptSpec (e.SpecInfo) e.AST
= e.AST;
$ENTRY OptTree-Spec-CleanupColdFunctions {
e.AST = e.AST;
}

/*
Expand Down Expand Up @@ -748,28 +754,6 @@ IsSpecStaticVar {
};
}

IsColdArg {
e.Argument
= <Reduce
{
False t.Any = False;

True (CallBrackets e.Expression) = False;

True (ClosureBrackects e.ClosureContent) = <IsColdArg e.ClosureContent>;

True (Brackets e.Expression) = <IsColdArg e.Expression>;

True (ADT-Brackets (e.Name) e.Expression) = <IsColdArg e.Expression>;

True t.Other = True;

}
True
e.Argument
>;
}

MapGenericMatches {
(e.ArgStaticMatches) (e.PatternStaticMatches)
= <Reduce
Expand Down
113 changes: 51 additions & 62 deletions src/compiler/OptTree.ref
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ $INCLUDE "LibraryEx";
$EXTERN Config-GetTreeOptCycles, Config-GetOptDrive, Config-GetOptSpec;

*$FROM OptTree-Drive
$EXTERN OptTree-Drive-ExtractOptInfo, OptTree-Drive, OptTree-Drive-Finalize;
$EXTERN OptTree-Drive-ExtractOptInfo, OptTree-Drive,
OptTree-Drive-CleanupColdCalls;

*$FROM OptTree-Spec
$EXTERN OptTree-Spec-ExtractOptInfo, OptTree-Spec, OptTree-Spec-Finalize;
$EXTERN OptTree-Spec-ExtractOptInfo, OptTree-Spec,
OptTree-Spec-CleanupColdFunctions;

*$FROM Log
$EXTERN Log-PutLine, Log-AST;
Expand Down Expand Up @@ -62,22 +64,22 @@ OptTree-Aux {
DoOptTree {
0 s.OptDrive s.OptSpec
(e.DriveInfo) (e.SpecInfo) (e.OptimizableFunctions) e.AST
= <OptTree-Drive-Finalize s.OptDrive (e.DriveInfo) e.AST> : e.AST^
= <OptTree-Spec-Finalize s.OptSpec (e.SpecInfo) e.AST> : e.AST^
= <OptTree-Simple-Finalize e.AST> : e.AST^
= e.AST;
= <OptTree-Spec-CleanupColdFunctions e.AST>;

s.Cycles s.OptDrive s.OptSpec
(e.DriveInfo) (e.SpecInfo) (e.OptimizableFunctions) e.AST
= <Log-AST ('Pass ' <Symb s.Cycles>) e.AST> : e.AST^
= e.AST : e.OriginAST
= <OptTree-Simple (e.OptimizableFunctions) e.AST> : e.AST^
= <OptTree-Drive s.OptDrive (e.DriveInfo) e.AST> : (e.DriveInfo^) e.AST^
= <OptTree-Spec s.OptSpec (e.SpecInfo) e.AST> : (e.SpecInfo^) e.AST^

= <DoOptTree-DriveLoop s.Cycles s.OptDrive (e.DriveInfo) e.AST>
: s.Cycles^ (e.DriveInfo^) e.AST^

= <DoOptTree-SpecPass s.Cycles s.OptSpec (e.SpecInfo) e.AST>
: s.Cycles^ (e.SpecInfo^) e.AST^

= e.AST
: {
e.OriginAST = 0 e.OriginAST;
e.AST^ = <Dec s.Cycles> e.AST;
e.AST^ = s.Cycles e.AST;
}
: s.Cycles^ e.AST^
= <DoOptTree
Expand All @@ -86,6 +88,40 @@ DoOptTree {
>;
}

DoOptTree-DriveLoop {
0 s.OptDrive (e.DriveInfo) e.AST
= <OptTree-Drive-CleanupColdCalls e.AST> : e.AST^
= 0 (e.DriveInfo) e.AST;

s.Cycles s.OptDrive (e.DriveInfo) e.AST
= e.DriveInfo : (e.DriveNames) e.Info
= <Log-AST ('Pass ' <Symb s.Cycles> ' (before Drive)') e.AST> : e.AST^
= e.AST : e.OriginAST
= <OptTree-Simple (e.DriveNames) e.AST> : e.AST^
= <Dec s.Cycles> : s.Cycles^
= <OptTree-Drive s.OptDrive (e.DriveInfo) e.AST> : (e.DriveInfo^) e.AST^
= e.AST
: {
e.OriginAST
= s.Cycles (e.DriveInfo)
<OptTree-Drive-CleanupColdCalls e.AST>;

e.AST^
= <DoOptTree-DriveLoop s.Cycles s.OptDrive (e.DriveInfo) e.AST>;
};
}

DoOptTree-SpecPass {
0 s.OptSpec (e.SpecInfo) e.AST = (e.SpecInfo) e.AST;

s.Cycles s.OptSpec (e.SpecInfo) e.AST
= <Log-AST ('Pass ' <Symb s.Cycles> ' (before Spec)') e.AST> : e.AST^
= <Dec s.Cycles> <OptTree-Spec s.OptSpec (e.SpecInfo) e.AST>
: s.Cycles^ (e.SpecInfo^) e.AST^
= s.Cycles (e.SpecInfo) <OptTree-Drive-CleanupColdCalls e.AST>
}



/**
<OptTree-CleanupMarkup e.AST> == e.OptAST
Expand All @@ -95,6 +131,10 @@ $ENTRY OptTree-CleanupMarkup {
}


OptTree-ExpandClosures {
e.AST = <OptTree-Drive-CleanupColdCalls <OptTree-Simple () e.AST>>;
}

OptTree-Simple {
(e.OptimizableFunctions) e.AST
= <Map
Expand Down Expand Up @@ -190,54 +230,3 @@ OptResultTerm {
e.OptimizableFunctions s.Temp t.OtherTerm = s.Temp t.OtherTerm;
}

OptTree-Simple-Finalize {
e.AST
= <Map
{
(Function s.ScopeClass (e.Name) Sentences e.Body)
= (Function
s.ScopeClass (e.Name) Sentences <CleanupCold-Body e.Body>
);

t.OtherItem = t.OtherItem;
}
e.AST
>;
}

CleanupCold-Body {
e.Sentences = <Map &CleanupCold-Sentence e.Sentences>;
}

CleanupCold-Sentence {
((e.Pattern) e.Conditions (e.Result))
= (
(e.Pattern)
<Map
{
(Condition (e.Name) (e.Result^) (e.Pattern^))
= (Condition
(e.Name) (<CleanupCold-Result e.Result>) (e.Pattern)
);
}
e.Conditions
>
(<CleanupCold-Result e.Result>)
);
}

CleanupCold-Result {
e.Result = <Map &CleanupCold-Term e.Result>;
}

CleanupCold-Term {
(Brackets e.Expr) = (Brackets <CleanupCold-Result e.Expr>);

(ADT-Brackets (e.Name) e.Expr)
= (ADT-Brackets (e.Name) <CleanupCold-Result e.Expr>);

(CallBrackets e.Expr) = (CallBrackets <CleanupCold-Result e.Expr>);
(ColdCallBrackets e.Expr) = (CallBrackets <CleanupCold-Result e.Expr>);

t.OtherTerm = t.OtherTerm;
}

0 comments on commit 1e38bfc

Please sign in to comment.