simple set optimisation

the price of having simple code (generation) is that
it is sometimes stupid code that gets generated
Filter some of the really daft stuff out
This commit is contained in:
Torsten Ruger 2015-06-21 17:25:27 +03:00
parent aafb179c61
commit f3ee11fca5
2 changed files with 20 additions and 1 deletions

View File

@ -0,0 +1,19 @@
module Virtual
class SetOptimisation
def run block
block.codes.dup.each_with_index do |code , i|
next unless code.is_a? Virtual::Set
next_code = block.codes[i+1]
next unless next_code.is_a? Virtual::Set
next unless code.to == next_code.from
# TODO: a correct implementation would have to check that the code.to
# is not used in further blocks, before being assigned to
new_code = Virtual::Set.new(code.from , next_code.to )
block.replace(code , [new_code] )
block.replace(next_code , [] )
end
end
end
Virtual.machine.add_pass "Virtual::SetOptimisation"
end

View File

@ -6,7 +6,7 @@ class HelloTest < MiniTest::Test
def check def check
machine = Virtual::Machine.boot machine = Virtual::Machine.boot
expressions = machine.compile_main @string_input expressions = machine.compile_main @string_input
output_at = Virtual::Machine::FIRST_PASS output_at = "Virtual::SetOptimisation"
#{}"Register::CallImplementation" #{}"Register::CallImplementation"
machine.run_before output_at machine.run_before output_at
puts Sof.write(machine.space) puts Sof.write(machine.space)