diff options
author | Andy Wingo <wingo@pobox.com> | 2018-01-19 21:57:03 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2018-01-19 21:57:03 +0100 |
commit | 557acdbbba9e3bcc1108d81cbf8c2f7c14fcb29a (patch) | |
tree | df9eb06704d73168960f518cb18de49b2ea320c1 /module/language/tree-il/cps-primitives.scm | |
parent | 310c34e11200db58f59c119d58c65822728ba3ba (diff) | |
download | guile-557acdbbba9e3bcc1108d81cbf8c2f7c14fcb29a.tar.gz |
Instruction explosion for struct-ref, struct-set!
* module/language/cps/effects-analysis.scm (&memory-kind-mask): Add
&bitmask, for the bitmask in vtables.
(annotation->memory-kind): Add 'bitmask case.
* module/language/tree-il/compile-cps.scm (ensure-struct-index-in-range):
(prepare-struct-scm-access): New helpers.
(struct-ref/immediate, struct-set!/immediate): New exploded lowering
routines.
(struct-ref, struct-set!): New lowering routines that just do a call.
(canonicalize): Remove struct-ref hack; lowering procedures will
handle it.
* module/language/tree-il/cps-primitives.scm (bytevector-length): Define
struct-set! as returning a value.
Diffstat (limited to 'module/language/tree-il/cps-primitives.scm')
-rw-r--r-- | module/language/tree-il/cps-primitives.scm | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/module/language/tree-il/cps-primitives.scm b/module/language/tree-il/cps-primitives.scm index 6888ab9f8..be92de6a0 100644 --- a/module/language/tree-il/cps-primitives.scm +++ b/module/language/tree-il/cps-primitives.scm @@ -104,7 +104,11 @@ (define-cps-primitive struct-vtable 1 1) (define-cps-primitive allocate-struct 2 1) (define-cps-primitive struct-ref 2 1) -(define-cps-primitive struct-set! 3 0) + +;; Unhappily, and undocumentedly, struct-set! returns the value that was +;; set. There is code that relies on this. The struct-set! lowering +;; routines ensure this return arity. +(define-cps-primitive struct-set! 3 1) (define-cps-primitive class-of 1 1) |