From: Nikodemus S. <nik...@ra...> - 2014-06-24 11:05:31
|
On 24 June 2014 07:56, Stas Boukarev <sta...@gm...> wrote: > I don't think that it's totally different, before, > (let ((x (intern "x" :keyword))) (unintern x :keyword) (keywordp x)) > returned NIL, now it returns T. I'm trying to decide if I think this is somehow different from (let ((x :foo)) (unintern x) (keywordp x)) => T which has been the case for a long time... Still, I suspect KEYWORD is a dangerous type to use in inference because like dimensions for non-simple arrays, or CONS-types it can change over the lifetime of the object. ir1opt.lisp has working but hacky code that allows using some CONS and array types safely under the nomer of LVAR-CONSERVATIVE-TYPE. ...but instead of adding KEYWORD there as well (which would definitely be doable), I would suggest re-architecting it a bit: 1. Call these "handle with care" types LVAR-VOLATILE-TYPE. 2. Make sure such types don't end up in LVAR-TYPE unless explicitly DECLAREd. 3. Use LVAR-VOLATILE-TYPE only (a) if it all LVAR-USES are "known harmless", or (b) if it can be proven that none of the "possibly harmful" LVAR-USES is a predecessor of the current node. 4. Add clobbers-arg-types annotations to fndb for functions that do. ...A is should be easy to implement and covers many more cases than the current code. B is left as an exercise to reader. :) Cheers, -- nikodemus |