From 180983fb4bb219ff6054c4f9f74fec782c75dbae Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 6 May 2021 07:02:22 -0600 Subject: [PATCH] cs: fix encuoraged and cross-module inlining of `set!` When an inlined `set!` mutates a variable that's bound in the inlined function, the `set!` target was not updated to refer to the inlined binding. Closes #3817 --- pkgs/racket-test-core/tests/racket/optimize.rktl | 15 +++++++++++++++ racket/src/cs/schemified/schemify.scm | 10 ++++++---- racket/src/schemify/inline.rkt | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/pkgs/racket-test-core/tests/racket/optimize.rktl b/pkgs/racket-test-core/tests/racket/optimize.rktl index 2a15f5a981..5469197024 100644 --- a/pkgs/racket-test-core/tests/racket/optimize.rktl +++ b/pkgs/racket-test-core/tests/racket/optimize.rktl @@ -7132,6 +7132,21 @@ (f (+ 6.0 (one)) (+ 6.0 (one))))) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Regression test to checking inlingin with `set!`: + +(module check-inline-of-set!-expression racket/base + (require racket/performance-hint) + (begin-encourage-inline + (define (f x) + (let ([y 0]) + (set! y (+ y x)) + y))) + (define result (list (f 1) (f 2))) + (provide result)) + +(test '(1 2) dynamic-require ''check-inline-of-set!-expression 'result) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs) diff --git a/racket/src/cs/schemified/schemify.scm b/racket/src/cs/schemified/schemify.scm index faa5b1c912..e4efda2b5c 100644 --- a/racket/src/cs/schemified/schemify.scm +++ b/racket/src/cs/schemified/schemify.scm @@ -12722,10 +12722,12 @@ (values id_1 rhs_0))))))) (case-lambda ((id_0 rhs_0) - (list - 'set! - id_0 - (clone-expr rhs_0 env_0 mutated_0))) + (let ((app_0 + (clone-expr id_0 env_0 mutated_0))) + (list + 'set! + app_0 + (clone-expr rhs_0 env_0 mutated_0)))) (args (raise-binding-result-arity-error 2 args)))) (if (if (eq? '|#%variable-reference| hd_0) diff --git a/racket/src/schemify/inline.rkt b/racket/src/schemify/inline.rkt index 3098caa5b6..5079754545 100644 --- a/racket/src/schemify/inline.rkt +++ b/racket/src/schemify/inline.rkt @@ -207,7 +207,7 @@ [`(begin-unsafe ,exps ...) `(begin-unsafe . ,(clone-body exps env mutated))] [`(set! ,id ,rhs) - `(set! ,id ,(clone-expr rhs env mutated))] + `(set! ,(clone-expr id env mutated) ,(clone-expr rhs env mutated))] [`(#%variable-reference) v] [`(#%variable-reference ,id) `(#%variable-reference ,(clone-expr id env mutated))]