Posted to tcl by hypnotoad at Mon Feb 19 19:12:42 GMT 2018view pretty

basra:quadcode seandeelywoods$ tclsh demos/perftest/tester.tcl -just fib -quadcode-log widen
restrict <- fib
quadcode-log <- widen
CONFIGURE: -quadcode-log widen 
==================TIME (ORIGINAL)===================
eval fib 85: "259695496911122585"
time fib 85: 8.859180279617366 microseconds per iteration
======================COMPILING=====================
get-command-list: 52 microseconds
WARNING:varframe.tcl:2972:callframe.store.array:make.array should trigger traces
WARNING:varframe.tcl:783:tcl.callframe.load of array should trigger traces
init-module: 915577 microseconds
register: 10597 microseconds
widen:
Procedure: ::fib(STRING)
bb 0:
  0: entry {} {literal {n a b i c}}
  1: param {var n 4} {arg 0}
  2: jump {bb 1}
bb 1:
  0: @debug-line {} {literal 45}
  1: @debug-script {} {literal {expr {int($n)}}}
  2: {instanceOf 252 NUMERIC} {temp 2 6} {var n 4}
  3: jumpTrue {bb 3} {temp 2 6}
  4: jump {bb 2}
bb 2:
  0: initException {temp 57 31} {literal {can't use non-numeric value as operand of "::tcl::mathfunc::int"}} {literal {-errorcode {ARITH DOMAIN {non-numeric string}}}} {literal 1} {literal 0}
  1: returnCode {temp 51 0} {temp 57 31}
  2: procLeave {temp 52 0} {temp 51 0} {literal fib}
  3: return {} Nothing {temp 52 0}
bb 3:
  0: {narrowToType 252 NUMERIC} {var n 11} {var n 4}
  1: invoke {temp 57 33} Nothing {literal ::tcl::mathfunc::int} {var n 11}
  2: @debug-script {} {literal {set n [expr {int($n)}]}}
  3: copy {var n 16} {temp 57 33}
  4: @debug-line {} {literal 46}
  5: @debug-script {} {literal {if {$n < 1} {
	return 0
    }}}
  6: lt {temp 53 0} {var n 16} {literal 1}
  7: jumpFalse {bb 5} {temp 53 0}
  8: jump {bb 4}
bb 4:
  0: @debug-line {} {literal 47}
  1: @debug-script {} {literal {return 0}}
  2: return {} Nothing {literal 0}
bb 5:
  0: @debug-line {} {literal 46}
  1: @debug-script {} {literal {if {$n < 1} {
	return 0
    }}}
  2: @debug-line {} {literal 49}
  3: @debug-script {} {literal {set a 0}}
  4: @debug-line {} {literal 50}
  5: @debug-script {} {literal {set b 1}}
  6: @debug-line {} {literal 51}
  7: @debug-script {} {literal {for {set i 1} {$i < $n} {incr i} {
	set c [expr {$a + $b}]
	set a $b
	set b $c
    }}}
  8: @debug-script {} {literal {set i 1}}
  9: @debug-script {} {literal {for {set i 1} {$i < $n} {incr i} {
	set c [expr {$a + $b}]
	set a $b
	set b $c
    }}}
  10: jump {bb 6}
bb 6:
  0: phi {var a 8} {bb 5} {literal 0} {bb 8} {var a 3}
  1: phi {var b 14} {bb 5} {literal 1} {bb 8} {var b 3}
  2: phi {var i 9} {bb 5} {literal 1} {bb 8} {var i 4}
  3: lt {temp 54 11} {var i 9} {var n 16}
  4: jumpTrue {bb 8} {temp 54 11}
  5: jump {bb 7}
bb 7:
  0: @debug-line {} {literal 56}
  1: @debug-script {} {literal {return $b}}
  2: return {} Nothing {var b 14}
bb 8:
  0: @debug-line {} {literal 52}
  1: @debug-script {} {literal {set c [expr {$a + $b}]}}
  2: @debug-script {} {literal {expr {$a + $b}}}
  3: add {temp 54 1} {var a 8} {var b 14}
  4: @debug-script {} {literal {set c [expr {$a + $b}]}}
  5: copy {var c 7} {temp 54 1}
  6: @debug-line {} {literal 53}
  7: @debug-script {} {literal {set a $b}}
  8: copy {var a 3} {var b 14}
  9: @debug-line {} {literal 54}
  10: @debug-script {} {literal {set b $c}}
  11: copy {var b 3} {var c 7}
  12: @debug-line {} {literal 51}
  13: @debug-script {} {literal {for {set i 1} {$i < $n} {incr i} {
	set c [expr {$a + $b}]
	set a $b
	set b $c
    }}}
  14: @debug-script {} {literal {incr i}}
  15: add {var i 4} {var i 9} {literal 1}
  16: @debug-script {} {literal {for {set i 1} {$i < $n} {incr i} {
	set c [expr {$a + $b}]
	set a $b
	set b $c
    }}}
  17: jump {bb 6}
-----------------------------------------------------------------------------
after widen:
Procedure: ::fib(STRING)
bb 0:
  0: entry {} {literal {n a b i c}}
  1: param {var n 4} {arg 0}
  2: jump {bb 1}
bb 1:
  0: @debug-line {} {literal 45}
  1: @debug-script {} {literal {expr {int($n)}}}
  2: {instanceOf 252 NUMERIC} {temp 2 6} {var n 4}
  3: jumpTrue {bb 3} {temp 2 6}
  4: jump {bb 2}
bb 2:
  0: initException {temp 57 31} {literal {can't use non-numeric value as operand of "::tcl::mathfunc::int"}} {literal {-errorcode {ARITH DOMAIN {non-numeric string}}}} {literal 1} {literal 0}
  1: returnCode {temp 51 0} {temp 57 31}
  2: procLeave {temp 52 0} {temp 51 0} {literal fib}
  3: {widenTo 536870972 {FAIL INT}} {temp 0 28} {temp 52 0}
  4: return {} Nothing {temp 0 28}
bb 3:
  0: {narrowToType 252 NUMERIC} {var n 11} {var n 4}
  1: invoke {temp 57 33} Nothing {literal ::tcl::mathfunc::int} {var n 11}
  2: @debug-script {} {literal {set n [expr {int($n)}]}}
  3: copy {var n 16} {temp 57 33}
  4: @debug-line {} {literal 46}
  5: @debug-script {} {literal {if {$n < 1} {
	return 0
    }}}
  6: lt {temp 53 0} {var n 16} {literal 1}
  7: jumpFalse {bb 5} {temp 53 0}
  8: jump {bb 4}
bb 4:
  0: @debug-line {} {literal 47}
  1: @debug-script {} {literal {return 0}}
  2: {widenTo 536870972 {FAIL INT}} {temp 0 29} {literal 0}
  3: return {} Nothing {temp 0 29}
bb 5:
  0: @debug-line {} {literal 46}
  1: @debug-script {} {literal {if {$n < 1} {
	return 0
    }}}
  2: @debug-line {} {literal 49}
  3: @debug-script {} {literal {set a 0}}
  4: @debug-line {} {literal 50}
  5: @debug-script {} {literal {set b 1}}
  6: @debug-line {} {literal 51}
  7: @debug-script {} {literal {for {set i 1} {$i < $n} {incr i} {
	set c [expr {$a + $b}]
	set a $b
	set b $c
    }}}
  8: @debug-script {} {literal {set i 1}}
  9: @debug-script {} {literal {for {set i 1} {$i < $n} {incr i} {
	set c [expr {$a + $b}]
	set a $b
	set b $c
    }}}
  10: {widenTo 60 INT} {var a 20} {literal 0}
  11: {widenTo 60 INT} {var b 32} {literal 1}
  12: {widenTo 60 INT} {var i 26} {literal 1}
  13: jump {bb 6}
bb 6:
  0: phi {var a 8} {bb 5} {var a 20} {bb 8} {var a 3}
  1: phi {var b 14} {bb 5} {var b 32} {bb 8} {var b 3}
  2: phi {var i 9} {bb 5} {var i 26} {bb 8} {var i 4}
  3: lt {temp 54 11} {var i 9} {var n 16}
  4: jumpTrue {bb 8} {temp 54 11}
  5: jump {bb 7}
bb 7:
  0: @debug-line {} {literal 56}
  1: @debug-script {} {literal {return $b}}
  2: {widenTo 536870972 {FAIL INT}} {temp 0 30} {var b 14}
  3: return {} Nothing {temp 0 30}
bb 8:
  0: @debug-line {} {literal 52}
  1: @debug-script {} {literal {set c [expr {$a + $b}]}}
  2: @debug-script {} {literal {expr {$a + $b}}}
  3: add {temp 54 1} {var a 8} {var b 14}
  4: @debug-script {} {literal {set c [expr {$a + $b}]}}
  5: copy {var c 7} {temp 54 1}
  6: @debug-line {} {literal 53}
  7: @debug-script {} {literal {set a $b}}
  8: copy {var a 3} {var b 14}
  9: @debug-line {} {literal 54}
  10: @debug-script {} {literal {set b $c}}
  11: copy {var b 3} {var c 7}
  12: @debug-line {} {literal 51}
  13: @debug-script {} {literal {for {set i 1} {$i < $n} {incr i} {
	set c [expr {$a + $b}]
	set a $b
	set b $c
    }}}
  14: @debug-script {} {literal {incr i}}
  15: add {var i 4} {var i 9} {literal 1}
  16: @debug-script {} {literal {for {set i 1} {$i < $n} {incr i} {
	set c [expr {$a + $b}]
	set a $b
	set b $c
    }}}
  17: jump {bb 6}
-----------------------------------------------------------------------------
specialise: 149724 microseconds
generate: 28624 microseconds
dump-pre: 21465 microseconds
optimize: 457552 microseconds
dump-post: 41872 microseconds
assemble: 573578 microseconds
==================TIME (OPTIMISED)==================
eval fib 85: "259695496911122585"
time fib 85: 0.2702796173657101 microseconds per iteration
=====================COMPARISON=====================
-------- fib 85 --------
Acceleration 3177.78%
=====================1/1 PASSED (1 FASTER)=====================