在SBCL中检查编译器优化

戴维波夫

有没有办法判断SBCL是否已对特定的源代码应用了优化?例如,在输入以下内容时,我希望将case语句优化为(print "0")

(defconstant +n+ 0)

(case +n+
  (0 (print "0"))
  (1 (print "1")))

但是扩展带来了一些不同:

* (macroexpand '(case +n+ (0 (print "0")) (1 (print "1"))))
(LET ((#:G415 +N+))
  (DECLARE (IGNORABLE #:G415))
  (COND ((EQL #:G415 '0) NIL (PRINT "0")) ((EQL #:G415 '1) NIL (PRINT "1"))))

这可能是一个不寻常的示例,但是一般来说,如何检查优化情况。

核心转储

正如Rainer Joswig解释的那样,一种可能性是检查拆卸情况。例如,使用SBCL:

CL-USER> (defconstant +n+ 0)  
"0" 
"0"

CL-USER> (disassemble (compile nil (lambda () (case +n+
  (0 (print "0"))
  (1 (print "1"))))))

上面的输出显示了代码已简化:

; disassembly for (LAMBDA ())
; Size: 32 bytes. Origin: #x52E552CC                          ; (LAMBDA ())
; CC:       498B4510         MOV RAX, [R13+16]                ; thread.binding-stack-pointer
; D0:       488945F8         MOV [RBP-8], RAX
; D4:       488B15B5FFFFFF   MOV RDX, [RIP-75]                ; "0"
; DB:       B902000000       MOV ECX, 2
; E0:       FF7508           PUSH QWORD PTR [RBP+8]
; E3:       B8A2324950       MOV EAX, #x504932A2              ; #<FDEFN PRINT>
; E8:       FFE0             JMP RAX
; EA:       CC10             INT3 16                          ; Invalid argument count trap
NIL

也可以显示如何配置编译器:

CL-USER> (sb-ext:describe-compiler-policy)
  Basic qualities:
COMPILATION-SPEED = 1
DEBUG = 1
SAFETY = 1
SPACE = 1
SPEED = 1
INHIBIT-WARNINGS = 1
  Dependent qualities:
SB-C::CHECK-CONSTANT-MODIFICATION = 1 -> 1 (maybe)
SB-C::TYPE-CHECK = 1 -> 3 (full)
SB-C::CHECK-TAG-EXISTENCE = 1 -> 3 (yes)
SB-C::LET-CONVERSION = 1 -> 3 (on)
SB-C:ALIEN-FUNCALL-SAVES-FP-AND-PC = 1 -> 3 (yes)
SB-C:VERIFY-ARG-COUNT = 1 -> 3 (yes)
SB-C::INSERT-DEBUG-CATCH = 1 -> 1 (maybe)
SB-C::RECOGNIZE-SELF-CALLS = 1 -> 0 (no)
SB-C::FLOAT-ACCURACY = 1 -> 3 (full)
SB-C:INSERT-STEP-CONDITIONS = 1 -> 0 (no)
SB-C::COMPUTE-DEBUG-FUN = 1 -> 1 (yes)
SB-C:STORE-SOURCE-FORM = 1 -> 1 (maybe)
SB-C::PRESERVE-SINGLE-USE-DEBUG-VARIABLES = 1 -> 0 (no)
SB-C::INSERT-ARRAY-BOUNDS-CHECKS = 1 -> 3 (yes)
SB-C::STORE-XREF-DATA = 1 -> 3 (yes)
SB-C:STORE-COVERAGE-DATA = 1 -> 0 (no)
SB-C::INSTRUMENT-CONSING = 1 -> 1 (no)
SB-C::STORE-CLOSURE-DEBUG-POINTER = 1 -> 0 (no)
SB-KERNEL:ALLOW-NON-RETURNING-TAIL-CALL = 1 -> 0 (no)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

R中的字节编译器优化

来自分类Dev

gcc中的编译器优化

来自分类Dev

R中的字节编译器优化

来自分类Dev

Java和C ++中for循环的边界检查的编译器/ JIT优化

来自分类Dev

编译器是否优化重复的相同检查

来自分类Dev

编译器是否优化重复的相同检查

来自分类Dev

联合优化中的分段错误与编译器优化

来自分类Dev

联合优化中的分段错误与编译器优化

来自分类Dev

编译器优化问题

来自分类Dev

编译器的优化指标

来自分类Dev

编译Lambda表达式时SBCL中的微妙编译器警告

来自分类Dev

Java优化编译器中的临时变量

来自分类Dev

编译器可以优化汇编中的函数序言吗?

来自分类Dev

Java优化编译器中的临时变量

来自分类Dev

在Visual Studio中配置编译器优化选项

来自分类Dev

编译器的信号和错误之间的区别(SBCL 1.2.4)

来自分类Dev

编译器的信号和错误之间的区别(SBCL 1.2.4)

来自分类Dev

令人困惑的 SBCL 编译器消息

来自分类Dev

nvcc编译器未优化

来自分类Dev

编译器是否优化String文字?

来自分类Dev

编译器优化回调与JMP

来自分类Dev

了解MSVS C ++编译器优化

来自分类Dev

C#编译器优化

来自分类Dev

禁用GLSL编译器优化

来自分类Dev

编译器优化或我的误解

来自分类Dev

编译器代码优化:AST与IR

来自分类Dev

阻止编译器优化逻辑

来自分类Dev

GCC编译器优化选项

来自分类Dev

禁用特定的编译器优化