[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 01/02: Add extensibility to Tree-IL effects analysis
From: |
Andy Wingo |
Subject: |
[Guile-commits] 01/02: Add extensibility to Tree-IL effects analysis |
Date: |
Wed, 15 Nov 2023 09:21:13 -0500 (EST) |
wingo pushed a commit to branch main
in repository guile.
commit e529db04a4c344ad3903c36fc771721bbda19ac4
Author: Andy Wingo <wingo@pobox.com>
AuthorDate: Wed Nov 15 14:59:02 2023 +0100
Add extensibility to Tree-IL effects analysis
* module/language/tree-il/effects.scm (add-primcall-effect-analyzer!):
New facility.
* module/language/tree-il/effects.scm (make-effects-analyzer): If a
primcall's args cause no effects, call out to a user-provided
effect-free? primitive for a primcall. If true, the primcall will be
marked as depending on all effects but causing none; this will allow it
to be elided by letrectify or peval.
---
module/language/tree-il/effects.scm | 22 +++++++++++++++++++---
1 file changed, 19 insertions(+), 3 deletions(-)
diff --git a/module/language/tree-il/effects.scm
b/module/language/tree-il/effects.scm
index a37a6d522..be3826239 100644
--- a/module/language/tree-il/effects.scm
+++ b/module/language/tree-il/effects.scm
@@ -35,7 +35,8 @@
effect-free?
constant?
depends-on-effects?
- causes-effects?))
+ causes-effects?
+ add-primcall-effect-analyzer!))
;;;
;;; Hey, it's some effects analysis! If you invoke
@@ -231,6 +232,12 @@
(and (not (causes-effects? a (&depends-on b)))
(not (causes-effects? b (&depends-on a)))))
+(define *primcall-effect-analyzers* (make-hash-table))
+(define (add-primcall-effect-analyzer! name compute-effect-free?)
+ (hashq-set! *primcall-effect-analyzers* name compute-effect-free?))
+(define (primcall-effect-analyzer name)
+ (hashq-ref *primcall-effect-analyzers* name))
+
(define (make-effects-analyzer assigned-lexical?)
"Returns a procedure of type EXP -> EFFECTS that analyzes the effects
of an expression."
@@ -576,8 +583,17 @@ of an expression."
;; A call to an unknown procedure can do anything.
(($ <primcall> _ name args)
- (logior &all-effects-but-bailout
- (cause &all-effects-but-bailout)))
+ (match (primcall-effect-analyzer name)
+ (#f (logior &all-effects-but-bailout
+ (cause &all-effects-but-bailout)))
+ (compute-effect-free?
+ (if (and (effect-free?
+ (exclude-effects (accumulate-effects args)
&allocation))
+ (compute-effect-free? args))
+ &all-effects-but-bailout
+ (logior &all-effects-but-bailout
+ (cause &all-effects-but-bailout))))))
+
(($ <call> _ proc args)
(logior &all-effects-but-bailout
(cause &all-effects-but-bailout)))