Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
compiler
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
17
Issues
17
List
Boards
Labels
Service Desk
Milestones
Operations
Operations
Incidents
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
clean-compiler-and-rts
compiler
Commits
7d1e8173
Commit
7d1e8173
authored
Jul 27, 2012
by
John van Groningen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
optimize is constructor functions
parent
3c35c046
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
143 additions
and
32 deletions
+143
-32
backendC/CleanCompilerSources/codegen.c
backendC/CleanCompilerSources/codegen.c
+8
-3
backendC/CleanCompilerSources/codegen1.c
backendC/CleanCompilerSources/codegen1.c
+38
-2
backendC/CleanCompilerSources/codegen1.h
backendC/CleanCompilerSources/codegen1.h
+1
-0
backendC/CleanCompilerSources/instructions.c
backendC/CleanCompilerSources/instructions.c
+32
-22
backendC/CleanCompilerSources/statesgen.c
backendC/CleanCompilerSources/statesgen.c
+63
-2
backendC/CleanCompilerSources/syntaxtr.t
backendC/CleanCompilerSources/syntaxtr.t
+1
-3
No files found.
backendC/CleanCompilerSources/codegen.c
View file @
7d1e8173
#define for_l(v,l,n) for(v=(l);v!=NULL;v=v->n)
#define SHARE_UPDATE_CODE 0
/* also in codegen1.c */
...
...
@@ -667,7 +666,8 @@ static void CodeRule (ImpRuleP rule)
if
(
rule_sdef
->
sdef_exported
){
GenExportStrictAndEaEntry
(
rule_sdef
);
}
else
if
(
!
(
rule_sdef
->
sdef_mark
&
(
SDEF_USED_CURRIED_MASK
|
SDEF_USED_LAZILY_MASK
|
SDEF_USED_STRICTLY_MASK
)))
}
else
if
(
!
(
rule_sdef
->
sdef_mark
&
(
SDEF_USED_CURRIED_MASK
|
SDEF_USED_LAZILY_MASK
)
||
(
rule_sdef
->
sdef_mark
&
SDEF_USED_STRICTLY_MASK
&&
!
(
rule_sdef
->
sdef_mark
&
SDEF_INLINE_IS_CONSTRUCTOR
))))
return
;
GenFunctionDescriptorAndExportNodeAndDescriptor
(
rule_sdef
);
...
...
@@ -882,7 +882,12 @@ static void CodeRule (ImpRuleP rule)
}
#endif
rule_may_fail
=
CodeRuleAlt
(
rule
->
rule_alts
,
init_a_stack_top
,
init_b_stack_top
,
CurrentAltLabel
.
lab_post
,
resultstate
);
if
((
rule_sdef
->
sdef_mark
&
SDEF_INLINE_IS_CONSTRUCTOR
)
!=
0
){
generate_is_constructor
(
rule
);
GenRtn
(
0
,
1
,
BasicSymbolStates
[
bool_type
]);
rule_may_fail
=
False
;
}
else
rule_may_fail
=
CodeRuleAlt
(
rule
->
rule_alts
,
init_a_stack_top
,
init_b_stack_top
,
CurrentAltLabel
.
lab_post
,
resultstate
);
if
(
function_called_only_curried_or_lazy_with_one_return
){
StateS
*
function_state_p
;
...
...
backendC/CleanCompilerSources/codegen1.c
View file @
7d1e8173
...
...
@@ -1340,7 +1340,7 @@ void GenerateCodeForConstructorsAndRecords (Symbol symbols)
for_l
(
fields
,
constructor
->
cl_fields
,
fl_next
)
GenLazyFieldSelectorEntry
(
fields
->
fl_symbol
->
symb_def
,
def
->
sdef_record_state
,
asize
,
bsize
);
}
}
}
}
}
...
...
@@ -3025,6 +3025,42 @@ static void jump_false_to_next_alternative (LabDef *esclabel,int remove_a,int re
}
}
void
generate_is_constructor
(
ImpRuleP
rule
)
{
NodeP
case_node
;
LabDef
symbol_label
;
case_node
=
rule
->
rule_alts
->
alt_rhs_root
->
node_arguments
->
arg_node
;
if
(
case_node
->
node_symbol
->
symb_kind
==
nil_symb
)
GenEqDesc
(
&
nil_lab
,
case_node
->
node_arity
,
0
);
else
if
(
case_node
->
node_symbol
->
symb_kind
==
cons_symb
){
struct
symbol
*
symbol
;
symbol
=
case_node
->
node_symbol
;
if
(
symbol
->
symb_head_strictness
==
1
||
symbol
->
symb_head_strictness
>=
3
){
GenEqDesc
(
&
nil_lab
,
0
,
0
);
GenNotB
();
}
else
GenEqDesc
(
&
cons_lab
,
case_node
->
node_arity
,
0
);
}
else
{
SymbDef
sdef
;
sdef
=
case_node
->
node_symbol
->
symb_def
;
if
(
sdef
->
sdef_kind
==
CONSTRUCTOR
&&
sdef
->
sdef_strict_constructor
&&
sdef
->
sdef_arity
==
case_node
->
node_arity
)
{
ConvertSymbolToKLabel
(
&
symbol_label
,
sdef
);
GenEqDesc
(
&
symbol_label
,
0
,
0
);
}
else
{
ConvertSymbolToConstructorDLabel
(
&
symbol_label
,
sdef
);
GenEqDesc
(
&
symbol_label
,
case_node
->
node_arity
,
0
);
}
}
GenPopA
(
1
);
}
static
void
CheckSymbol
(
Label
symblab
,
int
arity
,
int
stackpos
,
int
remove_a
,
int
remove_b
,
Label
esclabel
)
{
GenEqDesc
(
symblab
,
arity
,
stackpos
);
...
...
@@ -3431,7 +3467,7 @@ static int generate_code_for_switch_node (NodeP node,int asp,int bsp,struct esc
GenJmp
(
&
case_label
);
matches_always
=
1
;
}
else
{
}
else
{
if
(
sdef
->
sdef_kind
==
CONSTRUCTOR
&&
sdef
->
sdef_strict_constructor
&&
sdef
->
sdef_arity
==
case_node
->
node_arity
)
{
...
...
backendC/CleanCompilerSources/codegen1.h
View file @
7d1e8173
...
...
@@ -131,3 +131,4 @@ extern ImpRuleS *create_simple_imp_rule (struct node *lhs_root,struct node *rhs_
#define unused_node_id(node_id) ((node_id)->nid_refcount!=-1 ? (node_id)->nid_refcount==0 : unused_node_id_ (node_id))
extern
int
unused_node_id_
(
NodeId
node_id
);
extern
void
generate_is_constructor
(
ImpRuleP
rule
);
backendC/CleanCompilerSources/instructions.c
View file @
7d1e8173
...
...
@@ -1217,7 +1217,7 @@ static void CallFunction2 (Label label, SymbDef def, Bool isjsr, StateS root_sta
CurrentModule
=
def
->
sdef_module
;
CurrentExt
=
GetFileExtension
(
abcFile
);
StaticMessage
(
False
,
"%D"
,
"no inline code for this
rule
"
,
def
);
StaticMessage
(
False
,
"%D"
,
"no inline code for this
function
"
,
def
);
CurrentModule
=
previous_module
;
CurrentExt
=
previous_ext
;
...
...
@@ -1231,31 +1231,41 @@ static void CallFunction2 (Label label, SymbDef def, Bool isjsr, StateS root_sta
}
else
GenJmp
(
label
);
}
}
else
if
(
def
->
sdef_kind
==
IMPRULE
&&
IsInlineFromCurrentModule
(
def
)){
Instructions
instruction
,
last
,
first
,
next
;
return
;
}
if
(
def
->
sdef_kind
==
IMPRULE
){
if
((
def
->
sdef_mark
&
SDEF_INLINE_IS_CONSTRUCTOR
)
!=
0
){
generate_is_constructor
(
def
->
sdef_rule
);
if
(
!
isjsr
)
GenRtn
(
aout
,
bout
,
root_state
);
return
;
}
else
if
(
IsInlineFromCurrentModule
(
def
)){
Instructions
instruction
,
last
,
first
,
next
;
instruction
=
def
->
sdef_rule
->
rule_alts
->
alt_rhs_code
->
co_instr
;
instruction
=
instruction
->
instr_next
;
first
=
instruction
;
instruction
=
def
->
sdef_rule
->
rule_alts
->
alt_rhs_code
->
co_instr
;
instruction
=
instruction
->
instr_next
;
first
=
instruction
;
last
=
NULL
;
for
(;(
next
=
instruction
->
instr_next
)
!=
NULL
;
instruction
=
next
)
last
=
instruction
;
last
=
NULL
;
for
(;(
next
=
instruction
->
instr_next
)
!=
NULL
;
instruction
=
next
)
last
=
instruction
;
last
->
instr_next
=
NULL
;
GenInstructions
(
first
);
last
->
instr_next
=
instruction
;
last
->
instr_next
=
NULL
;
GenInstructions
(
first
);
last
->
instr_next
=
instruction
;
if
(
!
isjsr
)
GenRtn
(
aout
,
bout
,
root_state
);
}
else
{
GenDStackLayout
(
ain
,
bin
,
fun_args
);
if
(
isjsr
){
GenJsr
(
label
);
GenOStackLayoutOfState
(
aout
,
bout
,
root_state
);
}
else
GenJmp
(
label
);
}
if
(
!
isjsr
)
GenRtn
(
aout
,
bout
,
root_state
);
return
;
}
}
GenDStackLayout
(
ain
,
bin
,
fun_args
);
if
(
isjsr
){
GenJsr
(
label
);
GenOStackLayoutOfState
(
aout
,
bout
,
root_state
);
}
else
GenJmp
(
label
);
}
void
CallFunction
(
Label
label
,
SymbDef
def
,
Bool
isjsr
,
Node
root
)
...
...
backendC/CleanCompilerSources/statesgen.c
View file @
7d1e8173
...
...
@@ -2945,6 +2945,62 @@ static void set_states_in_lhs (ArgP arguments,StateP states)
}
#endif
static
void
mark_is_constructor_function
(
ImpRuleP
rule
)
{
RuleAltP
alt
;
alt
=
rule
->
rule_alts
;
if
(
alt
->
alt_kind
==
Contractum
&&
alt
->
alt_next
==
NULL
&&
alt
->
alt_rhs_defs
==
NULL
&&
alt
->
alt_lhs_defs
==
NULL
){
NodeP
node_p
;
ArgP
arg_p
;
arg_p
=
alt
->
alt_lhs_root
->
node_arguments
;
if
(
arg_p
!=
NULL
&&
arg_p
->
arg_next
==
NULL
&&
arg_p
->
arg_node
->
node_kind
==
NodeIdNode
){
node_p
=
alt
->
alt_rhs_root
;
if
(
node_p
->
node_kind
==
SwitchNode
){
NodeP
case_node
;
arg_p
=
node_p
->
node_arguments
;
case_node
=
arg_p
->
arg_node
;
if
(
case_node
->
node_kind
==
CaseNode
){
struct
symbol
*
symbol
;
NodeP
case_rhs_node
;
case_rhs_node
=
case_node
->
node_arguments
->
arg_node
;
if
(
case_rhs_node
->
node_kind
==
PushNode
)
case_rhs_node
=
case_rhs_node
->
node_arguments
->
arg_next
->
arg_node
;
symbol
=
case_node
->
node_symbol
;
if
(((
symbol
->
symb_kind
==
definition
&&
symbol
->
symb_def
->
sdef_kind
==
CONSTRUCTOR
)
||
symbol
->
symb_kind
==
nil_symb
||
symbol
->
symb_kind
==
cons_symb
)
&&
case_node
->
node_node_defs
==
NULL
&&
case_rhs_node
->
node_kind
==
NormalNode
&&
case_rhs_node
->
node_symbol
->
symb_kind
==
bool_denot
&&
case_rhs_node
->
node_symbol
->
symb_bool
==
True
)
{
arg_p
=
arg_p
->
arg_next
;
if
(
arg_p
!=
NULL
){
NodeP
default_node
;
default_node
=
arg_p
->
arg_node
;
if
(
arg_p
->
arg_node
->
node_kind
==
DefaultNode
){
NodeP
default_rhs_node
;
default_rhs_node
=
default_node
->
node_arguments
->
arg_node
;
if
(
default_node
->
node_node_defs
==
NULL
&&
default_rhs_node
->
node_kind
==
NormalNode
&&
default_rhs_node
->
node_symbol
->
symb_kind
==
bool_denot
&&
default_rhs_node
->
node_symbol
->
symb_bool
==
False
)
{
rule
->
rule_root
->
node_symbol
->
symb_def
->
sdef_mark
|=
SDEF_INLINE_IS_CONSTRUCTOR
;
}
}
}
}
}
}
}
}
}
void
GenerateStatesForRule
(
ImpRuleS
*
rule
)
{
SymbDef
rule_sdef
;
...
...
@@ -2975,10 +3031,15 @@ void GenerateStatesForRule (ImpRuleS *rule)
#ifdef OBSERVE_ARRAY_SELECTS_IN_PATTERN
set_states_of_array_selects_in_pattern
(
alt
);
#endif
#endif
}
else
if
(
rule
->
rule_type
==
NULL
)
StaticMessage
(
True
,
"%S"
,
ECodeBlock
,
CurrentSymbol
);
}
if
(
rule_sdef
->
sdef_arity
==
1
&&
function_state_p
[
-
1
].
state_type
==
SimpleState
&&
function_state_p
[
-
1
].
state_kind
==
OnB
&&
function_state_p
[
-
1
].
state_object
==
BoolObj
&&
function_state_p
[
0
].
state_type
==
SimpleState
&&
function_state_p
[
0
].
state_kind
==
StrictOnA
)
mark_is_constructor_function
(
rule
);
}
void
GenerateStates
(
ImpRules
rules
)
...
...
@@ -4014,7 +4075,7 @@ static void DetermineSharedAndAnnotatedNodesOfRule (ImpRuleP rule)
CurrentSymbol
=
rule
->
rule_root
->
node_symbol
;
rule_sdef
=
CurrentSymbol
->
symb_def
;
for_l
(
alt
,
rule
->
rule_alts
,
alt_next
)
if
(
alt
->
alt_kind
==
Contractum
){
CurrentLine
=
alt
->
alt_line
;
...
...
backendC/CleanCompilerSources/syntaxtr.t
View file @
7d1e8173
...
...
@@ -278,9 +278,7 @@ STRUCT (node_id,NodeId){
#define SHARED_NODES_COLLECTED_MASK 1
#define NID_ALIAS_MASK 2
#define NID_ALIAS_MARK_MASK 4
#define NID_COUNTED_AND_USED_IN_INNER_SCOPE 8
#define NID_EXTRA_REFCOUNT_MASK 16
#define COPY_NODE_MASK 64
#define ON_A_CYCLE_MASK 128
#define NID_VERIFY_MASK 256 /* macros */
#define NID_THEN_ELSE_NON_LOCAL_NODE_ID 512 /* pattern_match */
...
...
@@ -298,7 +296,6 @@ STRUCT (node_id,NodeId){
#endif
#define NID_FIELD_NAME_MASK 32 /* typechecker */
#define NID_COMPONENT_DETERMINED_MASK 256 /* optimise_lambda */
#define NID_LHS_PUSHED 4096 /* codegen1 */
#define NID_HAS_LAZY_SELECTOR_COUNTER 8192 /* statesgen */
...
...
@@ -659,6 +656,7 @@ STRUCT (symbol_def,SymbDef){
#define SDEF_NEXT_IMP_RULE_VERSION_MASK 32
#define SDEF_HAS_IMP_RULE_VERSIONS_MASK 64
#define SDEF_OPTIMISED_FUNCTION_MASK 128
#define SDEF_INLINE_IS_CONSTRUCTOR 4096
/* some macros to reuse bit fields */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment