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:
parent
aafb179c61
commit
f3ee11fca5
19
lib/virtual/passes/set_optimisation.rb
Normal file
19
lib/virtual/passes/set_optimisation.rb
Normal 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
|
@ -6,7 +6,7 @@ class HelloTest < MiniTest::Test
|
||||
def check
|
||||
machine = Virtual::Machine.boot
|
||||
expressions = machine.compile_main @string_input
|
||||
output_at = Virtual::Machine::FIRST_PASS
|
||||
output_at = "Virtual::SetOptimisation"
|
||||
#{}"Register::CallImplementation"
|
||||
machine.run_before output_at
|
||||
puts Sof.write(machine.space)
|
||||
|
Loading…
Reference in New Issue
Block a user