cs: fix optimizer bug

An optimization pass used mostly for inlining did not reqcognize
`quote`, and it could replace a quoted name with a constant-propagated
value.

Closes #3339
This commit is contained in:
Matthew Flatt 2020-08-08 13:03:40 -06:00
parent 980a9fbd4d
commit 4f0290186b
7 changed files with 757 additions and 715 deletions

View File

@ -3342,4 +3342,21 @@ case of module-leve bindings; it doesn't cover local bindings.
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(module regression-test-for-cross-module-inline-quoted-identifier racket/base
(module a racket/base
(provide FOUNDING)
(define-values (FOUNDING) 'FOUNDING))
(module b racket/base
(require (submod ".." a))
(define (f x_2) (eq? x_2 'FOUNDING)) ; quoted `FOUNDING` should not get replaced
(if (f FOUNDING) FOUNDING (raise-user-error 'die)))
(require (submod "." b)))
(parameterize ([current-output-port (open-output-bytes)])
(dynamic-require ''regression-test-for-cross-module-inline-quoted-identifier #f))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(report-errs)

View File

@ -345,7 +345,8 @@
(hash-map k
(lambda (k v)
(list `(quote ,k)
`(quote ,v))))))]
`(quote ,v)))
#t)))]
[(pair? k)
`(cons ,(loop (car k)) ,(loop (cdr k)))]
[(keyword? k)

View File

@ -125,105 +125,105 @@
(define kw2194 (string->keyword "set-hash!"))
(define hash2936
(hasheq
kw3163
'9
kw2525
'10
kw2762
'27
kw2707
'22
kw2600
'23
kw2241
'18
kw2333
'14
kw2645
'19
kw2626
'8
kw3357
'14
kw2603
'1
kw2607
'3
kw2821
'11
kw2099
'5
kw2582
'13
kw2796
'13
kw2755
'25
kw3245
'13
kw1932
'2
kw2241
'18
kw2802
'12
kw2677
'26
kw2804
'24
kw3163
'9
kw2645
'19
kw2931
'15
kw2897
'28
kw2641
'4
kw2802
'12
kw2626
'8
kw2603
'1
kw2600
'23
kw2129
'16
kw2525
'10
kw2821
'11
kw2967
'12
kw2607
'3
kw2677
'26
kw3245
'13
kw2804
'24
kw2582
'13
kw2762
'27
kw2099
'5
kw2535
'17
kw2473
'14
kw3357
'14
kw2333
'14
kw2201
'20
kw1932
'2
kw2226
'6
kw2755
'25
kw2496
'7
kw2535
'17
kw2641
'4
kw2226
'6
kw2169
'21))
'21
kw2967
'12))
(define kw2162 (string->keyword "not-recorded"))
(define hash2430
(hasheq
'letrec-values
'2
'|#%variable-reference|
'1
'begin
'5
'begin0
'6
'case-lambda
'1
'gensym
'12
'if
'13
'lambda
'1
'let-values
'2
'letrec-values
'2
'make-parameter
'7
'make-struct-field-accessor
'9
'make-struct-field-mutator
'10
'make-struct-type
'8
'make-struct-type-property
'11
'quote
'1
'case-lambda
'1
'make-parameter
'7
'gensym
'12
'begin0
'6
'make-struct-field-accessor
'9
'make-struct-field-mutator
'10
'lambda
'1
'begin
'5
'values
'3
'void
@ -232,189 +232,189 @@
(define kw2910 (string->keyword "empty-namespace"))
(define hash3012
(hash
'|prim-#%datum|
'1
'lift-loop
'1
'module-lift-end-loop
'1
'exit-local
'1
'prim-case-lambda
'1
'enter-bind
'block->letrec
'3
'block->list
'0
'tag
'1
'prim-letrec-values
'1
'module-end-lifts
'1
'exit-case
'1
'prim-begin0
'1
'splice
'1
'rename-one
'1
'start
'block-renames
'2
'enter-begin-for-syntax
'0
'enter-bind
'0
'enter-block
'1
'block->letrec
'3
'prim-provide
'1
'exit-prim
'1
'exit-begin-for-syntax
'0
'next-group
'0
'module-lift-loop
'1
'|prim-#%top|
'1
'lambda-renames
'2
'block->list
'0
'visit
'1
'local-bind
'1
'prim-stop
'1
'prim-letrec-syntaxes+values
'1
'prim-if
'1
'|prim-#%expression|
'1
'lift-module
'2
'local-pre
'1
'phase-up
'0
'prim-begin-for-syntax
'1
'enter-begin-for-syntax
'0
'prim-submodule*
'1
'tag/context
'1
'letX-renames
'5
'prepare-env
'0
'letlift-loop
'1
'lift-provide
'1
'prim-let-values
'1
'prim-define-syntaxes
'1
'|prim-#%app|
'1
'enter-list
'1
'prim-set!
'1
'rename-transformer
'1
'prim-begin
'1
'exit-macro
'2
'module-pass2-lifts
'3
'rename-list
'enter-local
'1
'enter-macro
'2
'tag2
'2
'prim-require
'1
'enter-prim
'1
'local-post
'1
'lift-require
'3
'exit-prim/return
'1
'exit-list
'1
'variable
'2
'macro-post-x
'2
'finish-block
'1
'|prim-#%stratified|
'1
'exit-local-bind
'0
'enter-local
'1
'macro-pre-x
'1
'opaque-expr
'1
'prim-lambda
'1
'prim-quote-syntax
'1
'|prim-#%variable-reference|
'1
'next
'0
'return
'1
'prim-submodule
'1
'module-pass1-case
'1
'module-body
'1
'start-top
'exit-begin-for-syntax
'0
'exit-bind
'0
'exit-case
'1
'exit-list
'1
'exit-local
'1
'exit-local-bind
'0
'exit-macro
'2
'exit-prim
'1
'exit-prim/return
'1
'finish-block
'1
'lambda-renames
'2
'letX-renames
'5
'letlift-loop
'1
'lift-end-decl
'3
'track-syntax
'3
'block-renames
'2
'prim-module-begin
'1
'prim-quote
'1
'prim-with-continuation-mark
'1
'module-pass1-lifts
'3
'local-value-result
'1
'lift-expr
'3
'prim-declare
'lift-loop
'1
'prim-module
'lift-module
'2
'lift-provide
'1
'lift-require
'3
'local-bind
'1
'local-post
'1
'local-pre
'1
'local-value
'1
'resolve
'local-value-result
'1
'macro-post-x
'2
'macro-pre-x
'1
'module-body
'1
'module-end-lifts
'1
'module-lift-end-loop
'1
'module-lift-loop
'1
'module-pass1-case
'1
'module-pass1-lifts
'3
'module-pass2-lifts
'3
'next
'0
'next-group
'0
'opaque-expr
'1
'phase-up
'0
'prepare-env
'0
'|prim-#%app|
'1
'|prim-#%datum|
'1
'|prim-#%expression|
'1
'|prim-#%stratified|
'1
'|prim-#%top|
'1
'|prim-#%variable-reference|
'1
'prim-begin
'1
'prim-begin-for-syntax
'1
'prim-begin0
'1
'prim-case-lambda
'1
'prim-declare
'1
'prim-define-syntaxes
'1
'prim-define-values
'1
'prim-if
'1
'prim-lambda
'1
'prim-let-values
'1
'prim-letrec-syntaxes+values
'1
'prim-letrec-values
'1
'prim-module
'1
'prim-module-begin
'1
'prim-provide
'1
'prim-quote
'1
'prim-quote-syntax
'1
'prim-require
'1
'prim-set!
'1
'prim-stop
'1
'prim-submodule
'1
'prim-submodule*
'1
'prim-with-continuation-mark
'1
'rename-list
'1
'rename-one
'1
'rename-transformer
'1
'resolve
'1
'return
'1
'splice
'1
'start
'0
'start-top
'0
'stop/return
'1
'tag
'1
'tag/context
'1
'tag2
'2
'track-syntax
'3
'variable
'2
'visit
'1))
(define kw2836 (string->keyword "missing"))
(define nhash2607 (cons #f (hasheq)))
@ -425,32 +425,32 @@
(define kw2186 (string->keyword "local"))
(define hash2294
(hasheq
'protect
'4
'for-syntax
'2
'all-defined
'9
'all-defined-except
'10
'all-from
'7
'all-from-except
'8
'struct
'6
'expand
'13
'prefix-all-defined-except
'12
'all-defined-except
'10
'prefix-all-defined
'11
'for-meta
'1
'for-label
'3
'for-meta
'1
'for-syntax
'2
'prefix-all-defined
'11
'prefix-all-defined-except
'12
'protect
'4
'rename
'5
'all-defined
'9))
'struct
'6))
(define kws2094
(cons
(string->keyword "cross-phase-persistent")

View File

@ -360,91 +360,91 @@
(define hash2725 (hash))
(define hash2337
(hasheq
'orig-dir
'7
'home-dir
'13
'host-config-dir
'5
'host-collects-dir
'6
'config-dir
'3
'init-file
'17
'collects-dir
'4
'exec-file
'1
'temp-dir
'8
'init-dir
'16
'pref-file
'11
'desk-dir
'14
'sys-dir
'9
'addon-dir
'12
'run-file
'2
'collects-dir
'4
'config-dir
'3
'desk-dir
'14
'doc-dir
'15
'exec-file
'1
'home-dir
'13
'host-collects-dir
'6
'host-config-dir
'5
'init-dir
'16
'init-file
'17
'orig-dir
'7
'pref-dir
'10
'doc-dir
'15))
'pref-file
'11
'run-file
'2
'sys-dir
'9
'temp-dir
'8))
(define hash2610 (hasheq))
(define hash3229
(hasheq
'sw_maximize
'2
'SW_RESTORE
'4
'SW_SHOWDEFAULT
'6
'SW_MINIMIZE
'3
'sw_showna
'10
'sw_showmaximized
'7
'sw_minimize
'3
'sw_showdefault
'6
'SW_SHOWMINNOACTIVE
'9
'sw_showminimized
'8
'SW_SHOWNOACTIVATE
'11
'SW_SHOWNA
'10
'SW_SHOWNORMAL
'12
'SW_SHOWMAXIMIZED
'7
'sw_show
'5
'SW_MAXIMIZE
'2
'SW_HIDE
'1
'SW_MAXIMIZE
'2
'SW_MINIMIZE
'3
'SW_RESTORE
'4
'SW_SHOW
'5
'SW_SHOWDEFAULT
'6
'SW_SHOWMAXIMIZED
'7
'SW_SHOWMINIMIZED
'8
'sw_shownoactivate
'SW_SHOWMINNOACTIVE
'9
'SW_SHOWNA
'10
'SW_SHOWNOACTIVATE
'11
'sw_restore
'4
'SW_SHOWNORMAL
'12
'sw_hide
'1
'sw_maximize
'2
'sw_minimize
'3
'sw_restore
'4
'sw_show
'5
'sw_showdefault
'6
'sw_showmaximized
'7
'sw_showminimized
'8
'sw_showminnoactive
'9
'sw_showna
'10
'sw_shownoactivate
'11
'sw_shownormal
'12
'SW_SHOW
'5))
'12))
(define call/ec call-with-escape-continuation)
(define bad-list$1
(|#%name|

View File

@ -26,112 +26,112 @@
(1/regexp? regexp?)))
(define hash1688
(hash
'#vu8(97 115 99 105 105)
'12
'#vu8(115 112 97 99 101)
'9
'#vu8(97 108 110 117 109)
'6
'#vu8(119 111 114 100)
'7
'#vu8(103 114 97 112 104)
'10
'#vu8(97 108 112 104 97)
'1
'#vu8(112 114 105 110 116)
'10
'#vu8(99 110 116 114 108)
'11
'#vu8(97 115 99 105 105)
'12
'#vu8(98 108 97 110 107)
'8
'#vu8(99 110 116 114 108)
'11
'#vu8(100 105 103 105 116)
'4
'#vu8(103 114 97 112 104)
'10
'#vu8(108 111 119 101 114)
'3
'#vu8(120 100 105 103 105 116)
'5
'#vu8(112 114 105 110 116)
'10
'#vu8(115 112 97 99 101)
'9
'#vu8(117 112 112 101 114)
'2))
'2
'#vu8(119 111 114 100)
'7
'#vu8(120 100 105 103 105 116)
'5))
(define hash2956
(hash
'#vu8(77 101)
'22
'#vu8(76 117)
'2
'#vu8(78 111)
'10
'#vu8(76 111)
'6
'#vu8(76 108)
'1
'#vu8(77 110)
'20
'#vu8(78 108)
'9
'#vu8(76 38)
'5
'#vu8(76 116)
'3
'#vu8(77 99)
'21
'#vu8(78 100)
'8
'#vu8(76 109)
'4
'#vu8(67 99)
'33
'#vu8(67 115)
'35
'#vu8(67 102)
'34
'#vu8(67 111)
'37
'#vu8(67 110)
'36
'#vu8(67)
'38
'#vu8(83)
'28
'#vu8(46)
'39
'#vu8(78)
'11
'#vu8(80)
'19
'#vu8(90)
'32
'#vu8(67)
'38
'#vu8(67 99)
'33
'#vu8(67 102)
'34
'#vu8(67 110)
'36
'#vu8(67 111)
'37
'#vu8(67 115)
'35
'#vu8(76)
'7
'#vu8(76 38)
'5
'#vu8(76 108)
'1
'#vu8(76 109)
'4
'#vu8(76 111)
'6
'#vu8(76 116)
'3
'#vu8(76 117)
'2
'#vu8(77)
'23
'#vu8(90 112)
'30
'#vu8(90 108)
'29
'#vu8(90 115)
'31
'#vu8(80 115)
'12
'#vu8(83 99)
'24
'#vu8(77 99)
'21
'#vu8(77 101)
'22
'#vu8(77 110)
'20
'#vu8(78)
'11
'#vu8(78 100)
'8
'#vu8(78 108)
'9
'#vu8(78 111)
'10
'#vu8(80)
'19
'#vu8(80 99)
'16
'#vu8(80 111)
'18
'#vu8(83 111)
'27
'#vu8(80 105)
'14
'#vu8(83 109)
'26
'#vu8(80 102)
'15
'#vu8(80 100)
'17
'#vu8(80 101)
'13
'#vu8(80 102)
'15
'#vu8(80 105)
'14
'#vu8(80 111)
'18
'#vu8(80 115)
'12
'#vu8(83)
'28
'#vu8(83 99)
'24
'#vu8(83 107)
'25))
'25
'#vu8(83 109)
'26
'#vu8(83 111)
'27
'#vu8(90)
'32
'#vu8(90 108)
'29
'#vu8(90 112)
'30
'#vu8(90 115)
'31))
(define hash2589 (hasheqv))
(define-values
(prop:keyword-impersonator keyword-impersonator? keyword-impersonator-ref)

File diff suppressed because it is too large Load Diff

View File

@ -111,6 +111,7 @@
unsafe-mode?]
[`(#%variable-reference) v]
[`(#%variable-reference ,id) v]
[`(quote ,_) v]
[`(,rator ,exps ...)
`(,(optimize* rator) ,@(optimize*-body exps))]
[`,_ v])))