From: Christophe R. <cs...@ca...> - 2006-03-08 16:00:03
|
Christophe Rhodes <cs...@ca...> writes: > Nathan Froyd <nf...@us...> writes: > >> Update of /cvsroot/sbcl/sbcl/src/compiler/ppc >> In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30066/src/compiler/ppc >> >> Modified Files: >> cell.lisp >> >> -(define-vop (instance-ref slot-ref) >> - (:variant instance-slots-offset instance-pointer-lowtag) >> - (:policy :fast-safe) >> - (:translate %instance-ref) >> - (:arg-types * (:constant index))) > > So it turns out that on this platform, the PPC, and (from reading the > code) the SPARC as well, this VOP is not redundant. The issue is, I > think, that the other %instance-ref transform, based on > word-index-ref, asserts that its first argument is of primitive type > instance (rather than *). > > The last compilation output from elgar's overnight build log was > > ; file: /home/boinkmark/scratch/autobench/src/code/target-type.lisp > ; in: DEFUN LAYOUT-OF > ; 'NULL > ; > ; note: deleting unreachable code > ; > ; note: deleting unreachable code > unhandled condition (of type BUG): > full call to %INSTANCE-REF > > Now, this is odd, because in LAYOUT-OF the call to %INSTANCE-REF is in > the true branch of a conditional on %INSTANCEP, and I'm pretty sure > that that is enough to tell the compiler that the type is definitely > INSTANCE. So, I'm not sure what's going on there, but I do observe > that the other platforms' DEFINE-FULL-REFFER for %INSTANCE-REF has a * > type restriction, not instance. A little more digging later: the error actually comes from the use of CLASSOID-OF in CTYPE-OF in the FUNCTION branch. The clue was that %INSTANCE-REF was being called on something with %DERIVED-TYPE: #<VALUES-TYPE (VALUES FUNCTION &OPTIONAL)>, which indeed the compiler cannot call %INSTANCE-REF on; the essential problem would appear to be that (sb-kernel:specifier-type '(and sb-kernel:instance function)) is returning the FUNCTION built-in-classoid, though those two types should be disjoint. Fixing this in the type system gets me further, to compiling INPUT-STREAM-P; this time I think PRIMITIVE-TYPE-AUX is the culprit; for various type inputs, including #<BUILT-IN-CLASSOID STREAM>, it will return (ANY) or the T primitive type, which again I believe (though I'm not sure; I don't know this area of the compiler terribly well) will lead to a full call if there are only templates with argument primitive type restrictions of INSTANCE. PRIMITIVE-TYPE-AUX is already a horrible mess of special cases that makes my brain hurt. Not that the general type system isn't, but I have years of familiarity with that :-). I'm not even sure that it is valid to make objects declared as STREAM always have primitive type INSTANCE; observe: (defclass foo (stream sb-mop:funcallable-standard-object) () (:metaclass sb-mop:funcallable-standard-class)) (= (sb-kernel:lowtag-of (make-instance 'foo)) sb-vm::fun-pointer-lowtag) ; => T So I can construct something which is TYPEP STREAM but has a non-INSTANCE lowtag. This is probably very bad; I can imagine all sorts of disasters happening in that case, in our current code as well. I'll check in the fixes to the type system, and maybe we need to think a bit more about the backend support for %INSTANCE-REF. Cheers, Christophe |