From d6372ef2dced88bba56d640b03158f1652671be5 Mon Sep 17 00:00:00 2001 From: Vincent St-Amour Date: Thu, 10 Oct 2013 13:15:05 -0400 Subject: [PATCH] TR for clause specialization: Report specialization failures. --- .../typed-racket/optimizer/sequence.rkt | 8 +++- .../marketplace-struct.rkt | 42 ++++++++++--------- .../missed-optimizations/sequence.rkt | 11 +++++ 3 files changed, 41 insertions(+), 20 deletions(-) create mode 100644 pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/optimizer/missed-optimizations/sequence.rkt diff --git a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/optimizer/sequence.rkt b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/optimizer/sequence.rkt index 5801a76389..a18d1f22e6 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/optimizer/sequence.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/optimizer/sequence.rkt @@ -91,4 +91,10 @@ 0 (lambda (x) (unsafe-fx< x end)) (lambda (x) #t) - (lambda (x y) #t))))) + (lambda (x y) #t)))) + (pattern (#%plain-app op:make-sequence arg:opt-expr s:opt-expr) + #:do [(log-missed-optimization + "non-specialized for clause" + "Typed Racket failed to specialize this `for' clause, which introduces run-time dispatch overhead. You can avoid this by limiting the sequence's type to a single kind of sequence (e.g. lists, vectors, or integers) or specializing the sequence manually (e.g. by wrapping it in an `in-list', `in-vector' or `in-range')." + #'s)] + #:with opt #'(op arg.opt s.opt))) diff --git a/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/optimizer/missed-optimizations/marketplace-struct.rkt b/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/optimizer/missed-optimizations/marketplace-struct.rkt index b2f668b519..b823bf08bc 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/optimizer/missed-optimizations/marketplace-struct.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/optimizer/missed-optimizations/marketplace-struct.rkt @@ -1,24 +1,28 @@ #;#; #< Void) +(define (seq-generic s) + (for: ([x : Integer s]) + (void)))