(define-symbol-macro %true-branches% ()) (defmacro with-compile-time-branching ((&rest branches) &body body &environment env) (cond ((not (null branches)) (destructuring-bind (branch . other-branches) branches (let ((true-branches (macroexpand-1 '%true-branches% env))) `(if ,branch (symbol-macrolet ((%true-branches% (,branch . ,true-branches))) (with-compile-time-branching (,@other-branches) ,@body)) (with-compile-time-branching (,@other-branches) ,@body))))) (t `(progn ,@body)))) (defmacro compile-time-if (branch then &optional else &environment env) (if (member branch (macroexpand-1 '%true-branches% env)) then (or else `(progn)))) (sb-ext:restrict-compiler-policy 'speed 3 3) ;; Compiling the below produces 72 compiler notes (defun make-adder (x &key huge-p enormous-p) (with-compile-time-branching (huge-p enormous-p) (lambda (y) (+ x y (compile-time-if huge-p 1000 0) (compile-time-if enormous-p 2000 0))))) CL-USER> (disassemble (make-adder 10)) ; disassembly for (LAMBDA (Y) :IN MAKE-ADDER) ; Size: 28 bytes. Origin: #x5370D5F7 ; (LAMBDA (Y) :IN MAKE-ADDER) ; 5F7: 488BD1 MOV RDX, RCX ; 5FA: E831352FFF CALL #x52A00B30 ; GENERIC-+ ; 5FF: 31FF XOR EDI, EDI ; 601: E82A352FFF CALL #x52A00B30 ; GENERIC-+ ; 606: 31FF XOR EDI, EDI ; 608: E823352FFF CALL #x52A00B30 ; GENERIC-+ ; 60D: 488BE5 MOV RSP, RBP ; 610: F8 CLC ; 611: 5D POP RBP ; 612: C3 RET NIL ;; Compiling the below (with a manually macroexpanded body) ;; produces 53 compiler notes (defun make-adder (x &key huge-p enormous-p) (IF HUGE-P (SYMBOL-MACROLET ((%TRUE-BRANCHES% (HUGE-P))) (IF ENORMOUS-P (SYMBOL-MACROLET ((%TRUE-BRANCHES% (ENORMOUS-P HUGE-P))) (PROGN #'(LAMBDA (Y) (+ X Y 1000 2000)))) (PROGN #'(LAMBDA (Y) (+ X Y 1000 0))))) (IF ENORMOUS-P (SYMBOL-MACROLET ((%TRUE-BRANCHES% (ENORMOUS-P))) (PROGN #'(LAMBDA (Y) (+ X Y 0 2000)))) (PROGN #'(LAMBDA (Y) (+ X Y 0 0)))))) CL-USER> (disassemble (make-adder 10)) ; disassembly for (LAMBDA (Y) :IN MAKE-ADDER) ; Size: 32 bytes. Origin: #x5370D168 ; (LAMBDA (Y) :IN MAKE-ADDER) ; 68: 48895DF8 MOV [RBP-8], RBX ; 6C: 31FF XOR EDI, EDI ; 6E: 488BD1 MOV RDX, RCX ; 71: E8BA392FFF CALL #x52A00B30 ; GENERIC-+ ; 76: 488B5DF8 MOV RBX, [RBP-8] ; 7A: 488BFB MOV RDI, RBX ; 7D: E8AE392FFF CALL #x52A00B30 ; GENERIC-+ ; 82: 488BE5 MOV RSP, RBP ; 85: F8 CLC ; 86: 5D POP RBP ; 87: C3 RET NIL