From: Nikodemus S. <nik...@ra...> - 2009-06-16 13:32:10
|
2009/6/15 Nikodemus Siivola <nik...@ra...>: > It is not immediately obvious why the conditions checked by the > mid-leg need to be true for a cast to be externally checkable (that > is, assumed to be checked by the callee.) My current belief is that (or (immediately-used-p lvar node) (binding* ((ctran (node-next cast) :exit-if-null) (next (ctran-next ctran))) (and (cast-p next) (eq (node-dest next) dest) (eq (cast-type-check next) :external)))) is a heuristic which tries to avoid using external (callee) checks for casts originating from declarations in user code. If this is so, the fix seems simple enough as the heuristic can be relaxed to ignore intervening refs, in addition to external casts to the same destination. Cheers, -- Nikodemus |
From: Nikodemus S. <nik...@ra...> - 2009-06-16 15:36:06
Attachments:
0001-relax-CAST-EXTERNALLY-CHECKABLE-P-a-bit.patch
|
2009/6/16 Nikodemus Siivola <nik...@ra...>: > My current belief is that > > (or (immediately-used-p lvar node) > (binding* ((ctran (node-next cast) :exit-if-null) > (next (ctran-next ctran))) > (and (cast-p next) > (eq (node-dest next) dest) > (eq (cast-type-check next) :external)))) > > is a heuristic which tries to avoid using external (callee) checks for > casts originating from declarations in user code. If this is so, the > fix seems simple enough as the heuristic can be relaxed to ignore > intervening refs, in addition to external casts to the same > destination. Based on this, the attached patch relaxes that restriction a bit, allowing (defun foo (x y) (string= x y)) to be compiled without type-checks in FOO, and shrinks to the by 72kb, all of it apparently redundant type checks. I'm deeply interested in hearing if this (a) causes problems for anyone (b) gives noticeable performance benefits. Cheers, -- Nikodemus |
From: Nikodemus S. <nik...@ra...> - 2009-06-17 20:04:49
|
2009/6/16 Nikodemus Siivola <nik...@ra...>: > Based on this, the attached patch relaxes that restriction a bit, allowing > > (defun foo (x y) (string= x y)) > > to be compiled without type-checks in FOO, and shrinks to the by 72kb, > all of it apparently redundant type checks. I'm deeply interested in > hearing if this (a) causes problems for anyone (b) gives noticeable > performance benefits. After convincing myself that the change is harmless I've committed this as 1.0.29.13. Cheers, -- Nikodemus |