! We want this to inline
[ t ] [ [ void* <c-direct-array> ] { <c-direct-array> } inlined? ] unit-test
[ V{ void*-array } ] [ [ void* <c-direct-array> ] final-classes ] unit-test
+
+[ t ] [ [ alien-unsigned-1 255 bitand ] { bitand fixnum-bitand } inlined? ] unit-test
+[ t ] [ [ alien-unsigned-1 255 swap bitand ] { bitand fixnum-bitand } inlined? ] unit-test
: simplify-bitand? ( value -- ? )
value-info literal>> positive-fixnum? ;
+: redundant-bitand? ( var 111... -- ? )
+ [ value-info ] bi@ { [
+ nip literal>>
+ { [ positive-fixnum? ] [ dup 1 + bitand zero? ] } 1&&
+ ] [
+ [ interval>> ] [ literal>> ] bi* 0 swap [a,b] interval-subset?
+ ] } 2&& ;
+
{
bitand-integer-integer
bitand-integer-fixnum
} [
[
{
+ {
+ [ dup in-d>> first2 redundant-bitand? ]
+ [ drop [ drop ] ]
+ }
+ {
+ [ dup in-d>> first2 swap redundant-bitand? ]
+ [ drop [ nip ] ]
+ }
{
[ dup in-d>> first simplify-bitand? ]
[ drop [ >fixnum fixnum-bitand ] ]