Index: /trunk/source/compiler/optimizers.lisp
===================================================================
--- /trunk/source/compiler/optimizers.lisp	(revision 14755)
+++ /trunk/source/compiler/optimizers.lisp	(revision 14756)
@@ -941,4 +941,7 @@
   (if first-p
     (if rest call first)))
+
+
+
 
 ;;; This isn't quite right... The idea is that (car (require-type foo
@@ -1003,4 +1006,8 @@
                            ((and (symbolp type)(find-class type nil env))
                             `(%require-type-class-cell ,arg (load-time-value (find-class-cell ',type t))))
+                           ((and (symbolp type)
+                                 #-bootstrapped-this (fboundp 'require-structure-type)
+                                 (structure-class-p type env))
+                            `(require-structure-type ,arg (load-time-value (find-class-cell ',type t))))
                            (t (let* ((val (gensym)))
                                 `(the ,type
Index: /trunk/source/level-1/sysutils.lisp
===================================================================
--- /trunk/source/level-1/sysutils.lisp	(revision 14755)
+++ /trunk/source/level-1/sysutils.lisp	(revision 14756)
@@ -310,4 +310,6 @@
       (%kernel-restart $xwrongtype arg type))))
 
+
+
 ;;; Might want to use an inverted mapping instead of (satisfies ccl::obscurely-named)
 (defun %require-type (arg predsym)
@@ -321,5 +323,10 @@
     (%kernel-restart $xwrongtype arg (car type-cell))))
 
-
+(defun require-structure-type (arg token)
+  (or(and (= (the fixnum (typecode arg)) target::subtag-struct)
+           (dolist (x (%svref arg 0))
+             (declare (optimize (speed 3) (safety 0)))
+             (when (eq x token) (return arg))))
+    (%kernel-restart $xwrongtype arg (if (typep token 'class-cell) (class-cell-name token) token))))
 
 ;;; In lieu of an inverted mapping, at least try to find cases involving
