diff --git a/wip-duuqnd/user-side-compiler/middle/compile-node-to-ir.lisp b/wip-duuqnd/user-side-compiler/middle/compile-node-to-ir.lisp index e29b1d9..ebbbb41 100644 --- a/wip-duuqnd/user-side-compiler/middle/compile-node-to-ir.lisp +++ b/wip-duuqnd/user-side-compiler/middle/compile-node-to-ir.lisp @@ -91,14 +91,27 @@ (build-begin builder continuation))) (defmethod compile-node ((node node-dotimes) builder) - (unless (zerop (ref-value (stop-ref node))) - (let ((const-zero (make-instance 'ir-constant)) - (const-stop (make-instance 'ir-constant)) - (loop-body (make-instance 'iblock :name "loop")) - (continuation (make-instance 'iblock :name "after_loop")) - (counter-variable (find-variable (counter-ref node) builder)) - - (test-result (make-instance 'ir-result))) + (unless (and (typep (stop-ref node) 'reference-constant) + (zerop (ref-value (stop-ref node)))) + (let* ((stop-ref-const-p (typep (stop-ref node) 'reference-constant)) + (const-zero (make-instance 'ir-constant)) + (const-stop (if stop-ref-const-p + (make-instance 'ir-constant) + (make-instance 'ir-result))) + (loop-body (make-instance 'iblock :name "loop")) + (continuation (make-instance 'iblock :name "after_loop")) + (counter-variable (find-variable (counter-ref node) builder)) + (test-result (make-instance 'ir-result))) + (unless stop-ref-const-p + (let ((zero (make-instance 'ir-constant))) + (build-insert (make-instance 'ir-getconst :input 0 :output zero) + builder) + (build-insert (make-instance + 'ir-plus + :inputs (list (compile-node (stop-ref node) builder) + zero) + :output const-stop) + builder))) (build-insert (make-instance 'ir-getconst :input 0 :output const-zero) builder) @@ -138,10 +151,11 @@ :input counter-variable :output counter-value) builder) - (build-insert (make-instance 'ir-getconst - :input (ref-value (stop-ref node)) - :output const-stop) - builder) + (when stop-ref-const-p + (build-insert (make-instance 'ir-getconst + :input (ref-value (stop-ref node)) + :output const-stop) + builder)) (build-insert (make-instance 'ir-test-equal :inputs (list counter-value const-stop) :output test-result)