Limit impact of O(n^2) type analysis by imposing limit
authorAndy Wingo <wingo@pobox.com>
Wed, 14 May 2014 19:42:09 +0000 (21:42 +0200)
committerAndy Wingo <wingo@pobox.com>
Thu, 15 May 2014 15:39:24 +0000 (17:39 +0200)
* module/language/cps/types.scm (infer-types): Add #:max-label-count
  argument.

* module/language/cps/type-fold.scm (compute-folded, fold-constants*):
  Disable for big functions.  Perhaps we can relax this if we find an
  O(n log n) way to represent types.

module/language/cps/type-fold.scm
module/language/cps/types.scm

index ca02fec..91f23df 100644 (file)
      ((eqv? type &nil) #nil)
      ((eqv? type &null) '())
      (else (error "unhandled type" type val))))
-  (let* ((typev (infer-types fun dfg))
-         (folded? (make-bitvector (/ (vector-length typev) 2) #f))
-         (folded-values (make-vector (bitvector-length folded?) #f)))
+  (let* ((typev (infer-types fun dfg #:max-label-count 3000))
+         (folded? (and typev
+                       (make-bitvector (/ (vector-length typev) 2) #f)))
+         (folded-values (and typev
+                             (make-vector (bitvector-length folded?) #f))))
     (define (label->idx label) (- label min-label))
     (define (var->idx var) (- var min-var))
     (define (maybe-fold-value! label name k def)
                                           (var->idx arg0) (var->idx arg1)))))
            (_ #f)))
         (_ #f)))
-    (match fun
-      (($ $cont kfun ($ $kfun src meta self tail clause))
-       (visit-cont clause)))
+    (when typev
+      (match fun
+        (($ $cont kfun ($ $kfun src meta self tail clause))
+         (visit-cont clause))))
     (values folded? folded-values)))
 
 (define (fold-constants* fun dfg)
              (($ $continue k src (and fun ($ $fun)))
               ($continue k src ,(visit-fun fun)))
              (($ $continue k src (and primcall ($ $primcall)))
-              ,(if (bitvector-ref folded? (label->idx label))
+              ,(if (and folded?
+                        (bitvector-ref folded? (label->idx label)))
                    (let ((val (vector-ref folded-values (label->idx label))))
                      ;; Uncomment for debugging.
                      ;; (pk 'folded src primcall val)
index 44deb04..22335f7 100644 (file)
@@ -1381,7 +1381,7 @@ mapping symbols to types."
        ;; All done!  Return the computed types.
        (else typev)))))
 
-(define (infer-types fun dfg)
+(define* (infer-types fun dfg #:key (max-label-count +inf.0))
   ;; Fun must be renumbered.
   (match fun
     (($ $cont min-label ($ $kfun _ _ min-var))
@@ -1412,7 +1412,8 @@ mapping symbols to types."
                    (values label-count var-count)))))
             fun 0 0))
        (lambda (label-count var-count)
-         (infer-types* dfg min-label label-count min-var var-count))))))
+         (and (< label-count max-label-count)
+              (infer-types* dfg min-label label-count min-var var-count)))))))
 
 (define (lookup-pre-type typev label def)
   (if (< def 0)