#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlopt/rcse1.scm,v 4.3 1987/12/31 05:49:33 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlopt/rcse1.scm,v 4.4 1987/12/31 07:01:21 cph Exp $
Copyright (c) 1987 Massachusetts Institute of Technology
(stack-reference-invalidate! address)
(if (not volatile?)
(insert-stack-destination! address (insert-source!))))
- (else
+ ((interpreter-register-reference? address)
+ (let ((hash (expression-hash address)))
+ (let ((memory-invalidate!
+ (lambda ()
+ (hash-table-delete! hash
+ (hash-table-lookup hash
+ address)))))
+ (if volatile?
+ (memory-invalidate!)
+ (assignment-memory-insertion address
+ hash
+ insert-source!
+ memory-invalidate!)))))
\f
+ (else
(let ((address (expression-canonicalize address)))
(rtl:set-assign-address! statement address)
(full-expression-hash address
element-address-varies?))))))
(if (or volatile? volatile?*)
(memory-invalidate!)
- (let ((address
- (find-cheapest-expression address hash
- false)))
- (let ((element (insert-source!)))
- (memory-invalidate!)
- (insert-memory-destination!
- address
- element
- (modulo (+ (symbol-hash 'ASSIGN) hash)
- (hash-table-size)))))))))
+ (assignment-memory-insertion address
+ hash
+ insert-source!
+ memory-invalidate!)))))
;; **** Kludge. Works only because stack-pointer
;; gets used in very fixed way by code generator.
(if (stack-push/pop? address)
(stack-pointer-adjust!
(rtl:address-number address))))))))))
+
+(define (assignment-memory-insertion address hash insert-source!
+ memory-invalidate!)
+ (let ((address (find-cheapest-expression address hash false)))
+ (let ((element (insert-source!)))
+ (memory-invalidate!)
+ (insert-memory-destination!
+ address
+ element
+ (modulo (+ (symbol-hash 'ASSIGN) hash) (hash-table-size))))))
\f
(define (trivial-action volatile? insert-source!)
(if (not volatile?)
#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlopt/rcse2.scm,v 4.2 1987/12/30 07:13:20 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlopt/rcse2.scm,v 4.3 1987/12/31 07:01:04 cph Exp $
Copyright (c) 1987 Massachusetts Institute of Technology
(expression-address-varies? (element-expression element))))
(define (expression-address-varies? expression)
- (if (memq (rtl:expression-type expression)
- '(OFFSET PRE-INCREMENT POST-INCREMENT))
- (not (= regnum:regs-pointer
- (rtl:register-number (rtl:address-register expression))))
- (rtl:any-subexpression? expression expression-address-varies?)))
+ (and (not (interpreter-register-reference? expression))
+ (or (memq (rtl:expression-type expression)
+ '(OFFSET PRE-INCREMENT POST-INCREMENT)))
+ (rtl:any-subexpression? expression expression-address-varies?)))
(define (expression-invalidate! expression)
;; Delete any expression which refers to this expression from the
#| -*-Scheme-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlopt/rcseep.scm,v 4.1 1987/12/08 13:56:02 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlopt/rcseep.scm,v 4.2 1987/12/31 07:00:47 cph Exp $
Copyright (c) 1987 Massachusetts Institute of Technology
(if (eq? (rtl:expression-type x) (rtl:expression-type y))
(expression-equivalent? x y false)
(rtl:any-subexpression? x loop))))
- (loop x))
\ No newline at end of file
+ (loop x))
+
+(define-integrable (interpreter-register-reference? expression)
+ (and (rtl:offset? expression)
+ (interpreter-regs-pointer? (rtl:offset-register expression))))
\ No newline at end of file