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) (report-errs)

View File

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

View File

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

View File

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

View File

@ -26,112 +26,112 @@
(1/regexp? regexp?))) (1/regexp? regexp?)))
(define hash1688 (define hash1688
(hash (hash
'#vu8(97 115 99 105 105)
'12
'#vu8(115 112 97 99 101)
'9
'#vu8(97 108 110 117 109) '#vu8(97 108 110 117 109)
'6 '6
'#vu8(119 111 114 100)
'7
'#vu8(103 114 97 112 104)
'10
'#vu8(97 108 112 104 97) '#vu8(97 108 112 104 97)
'1 '1
'#vu8(112 114 105 110 116) '#vu8(97 115 99 105 105)
'10 '12
'#vu8(99 110 116 114 108)
'11
'#vu8(98 108 97 110 107) '#vu8(98 108 97 110 107)
'8 '8
'#vu8(99 110 116 114 108)
'11
'#vu8(100 105 103 105 116) '#vu8(100 105 103 105 116)
'4 '4
'#vu8(103 114 97 112 104)
'10
'#vu8(108 111 119 101 114) '#vu8(108 111 119 101 114)
'3 '3
'#vu8(120 100 105 103 105 116) '#vu8(112 114 105 110 116)
'5 '10
'#vu8(115 112 97 99 101)
'9
'#vu8(117 112 112 101 114) '#vu8(117 112 112 101 114)
'2)) '2
'#vu8(119 111 114 100)
'7
'#vu8(120 100 105 103 105 116)
'5))
(define hash2956 (define hash2956
(hash (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) '#vu8(46)
'39 '39
'#vu8(78) '#vu8(67)
'11 '38
'#vu8(80) '#vu8(67 99)
'19 '33
'#vu8(90) '#vu8(67 102)
'32 '34
'#vu8(67 110)
'36
'#vu8(67 111)
'37
'#vu8(67 115)
'35
'#vu8(76) '#vu8(76)
'7 '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) '#vu8(77)
'23 '23
'#vu8(90 112) '#vu8(77 99)
'30 '21
'#vu8(90 108) '#vu8(77 101)
'29 '22
'#vu8(90 115) '#vu8(77 110)
'31 '20
'#vu8(80 115) '#vu8(78)
'12 '11
'#vu8(83 99) '#vu8(78 100)
'24 '8
'#vu8(78 108)
'9
'#vu8(78 111)
'10
'#vu8(80)
'19
'#vu8(80 99) '#vu8(80 99)
'16 '16
'#vu8(80 111)
'18
'#vu8(83 111)
'27
'#vu8(80 105)
'14
'#vu8(83 109)
'26
'#vu8(80 102)
'15
'#vu8(80 100) '#vu8(80 100)
'17 '17
'#vu8(80 101) '#vu8(80 101)
'13 '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) '#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 hash2589 (hasheqv))
(define-values (define-values
(prop:keyword-impersonator keyword-impersonator? keyword-impersonator-ref) (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?] unsafe-mode?]
[`(#%variable-reference) v] [`(#%variable-reference) v]
[`(#%variable-reference ,id) v] [`(#%variable-reference ,id) v]
[`(quote ,_) v]
[`(,rator ,exps ...) [`(,rator ,exps ...)
`(,(optimize* rator) ,@(optimize*-body exps))] `(,(optimize* rator) ,@(optimize*-body exps))]
[`,_ v]))) [`,_ v])))