Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
initial draft of optimizer, inactive ATM.
  • Loading branch information
timo committed Aug 20, 2013
1 parent de7cd46 commit 459e172
Show file tree
Hide file tree
Showing 6 changed files with 122 additions and 2 deletions.
7 changes: 7 additions & 0 deletions src/NQP/Compiler.nqp
@@ -1,4 +1,9 @@
class NQP::Compiler is HLL::Compiler {
method optimize($past, *%adverbs) {
%adverbs<optimize> eq 'off'
?? $past
!! NQP::Optimizer.new.optimize($past, |%adverbs)
}
}

# Create and configure compiler object.
Expand All @@ -8,6 +13,8 @@ $nqpcomp.parsegrammar(NQP::Grammar);
$nqpcomp.parseactions(NQP::Actions);
hll-config($nqpcomp.config);

$nqpcomp.addstage('optimize', :after<ast>);

# Add extra command line options.
my @clo := $nqpcomp.commandline_options();
@clo.push('parsetrace');
Expand Down
101 changes: 101 additions & 0 deletions src/NQP/Optimizer.nqp
@@ -0,0 +1,101 @@
class NQP::Optimizer {
has @!block_stack;

method optimize($ast, *%adverbs) {
#@!block_stack := [$ast[0]];
#self.visit_children($ast);
$ast;
}

method visit_block($block) {
@!block_stack.push($block);

self.visit_children($block);

@!block_stack.pop();

$block;
}

method find_sym(@name) {
if +@name == 1 {
my $final_name := @name[0];
my $i := +@!block_stack;
while $i > 0 {
$i := $i - 1;
my %sym := @!block_stack[$i].symbol($final_name);
if +%sym {
if nqp::existskey(%sym, 'value') {
say("found your $final_name");
return %sym<value>;
}
else {
nqp::die("No compile-time value for $final_name");
}
}
}
}
}

method visit_op($op) {
sub returns_int($node) {
if nqp::objprimspec($node.returns) == 1 {
return 1
}
if nqp::istype($node, QAST::Op) && $node.op ~~ /_i$/ {
return 1
} elsif nqp::istype($node, QAST::IVal) {
return 1
}
return 0;
}
self.visit_children($op);

if $op.op ~~ /^$<opt>=(add|sub|mul)_n$/ {
my $newopn := nqp::substr($op.op, 0, 3) ~ "_i";
say($op.op ~ " " ~ $newopn ~ " " ~ $op.dump);
say("returns int? " ~ returns_int($op[0]) ~ " \ " ~ returns_int($op[1]));
if returns_int($op[0]) && returns_int($op[1]) {
$op.name($newopn);
$op.returns(self.find_sym(["int"]));
say("transformed!");
} else {
$op.returns(self.find_sym(["num"]));
}
} elsif $op.op ~~ /_i$/ {
$op.returns(self.find_sym(["num"]));
} elsif $op.op ~~ /_s$/ {
$op.returns(self.find_sym(["str"]));
} elsif $op.op eq 'handle' {
return self.visit_handle($op);
}

$op;
}

method visit_handle($handle) {
self.visit_children($handle, :skip_selectors);
$handle;
}

method visit_children($node, :$skip_selectors) {
my int $i := 0;
unless nqp::isstr($node) {
while $i < +@($node) {
unless $skip_selectors && $i % 2 {
my $visit := $node[$i];
if nqp::istype($visit, QAST::Op) {
$node[$i] := self.visit_op($visit)
} elsif nqp::istype($visit, QAST::Block) {
$node[$i] := self.visit_block($visit)
} elsif nqp::istype($visit, QAST::Want) {
self.visit_children($visit, :skip_selectors)
} else {
self.visit_children($visit);
}
}
$i := $i + 1;
}
}
}
}
7 changes: 6 additions & 1 deletion src/QAST/IVal.nqp
@@ -1,7 +1,12 @@
class QAST::IVal is QAST::Node {
has int $!value;

method BUILD() {
nqp::bindattr(self, QAST::Node, '$!returns', int);
}

method value(*@value) { $!value := @value[0] if @value; $!value }

method substitute_inline_placeholders(@fillers) {
self
}
Expand Down
7 changes: 6 additions & 1 deletion src/QAST/NVal.nqp
@@ -1,7 +1,12 @@
class QAST::NVal is QAST::Node {
has num $!value;

method BUILD() {
nqp::bindattr(self, QAST::Node, '$!returns', num);
}

method value(*@value) { $!value := @value[0] if @value; $!value }

method substitute_inline_placeholders(@fillers) {
self
}
Expand Down
1 change: 1 addition & 0 deletions tools/build/Makefile-JVM.in
Expand Up @@ -130,6 +130,7 @@ NQP_SOURCES = \
src/NQP/World.nqp \
src/NQP/Grammar.nqp \
src/vm/jvm/NQP/Ops.nqp \
src/NQP/Optimizer.nqp \
src/NQP/Actions.nqp \
src/NQP/Compiler.nqp \

Expand Down
1 change: 1 addition & 0 deletions tools/build/Makefile-Parrot.in
Expand Up @@ -168,6 +168,7 @@ NQP_SOURCES = \
src/NQP/Grammar.nqp \
src/vm/parrot/NQP/Ops.nqp \
src/NQP/Actions.nqp \
src/NQP/Optimizer.nqp \
src/NQP/Compiler.nqp \

NQP_MO_SOURCES = src/how/Archetypes.nqp src/how/RoleToRoleApplier.nqp \
Expand Down

0 comments on commit 459e172

Please sign in to comment.