=head1 Hot path detection using decaying bloom filters

Instead of using a hash of pointer to counter, implement the following:

	- allocate a bitfield of size N. More bits = more accuracy. Maybe look into
	  dynamic bloom filters, to accomodate growing optree. Not really
	  important.

	- prepare K hash functions (simple galois field multiplications over random
	  primes or sth)

	- for every opcode address that matches the opmask, apply:

		bitfield, bloom_fill;
	
		do {
			bitoffset = hash(i++, ptr); /* ptr is a CV or a PL_op */
		} while ( i < k && bitfield[bitoffset] );

		if ( i < k ) {
			if ( ++bloom_fill > max_fill ) {
				/* if the bloom filter is too full implement random decay */
				for ( i = 0; i < chunk; i ++ ) {
					bitfield[random] = 0;
					bloom_fill--;
				}
			}

			/* finally set the bit for hash(k, PL_op */
			bitfield[bitoffset] = 1;
		} else {
			/* opcode exceeded threshold, execute trigger */
		}

		The bloom filter is a constant size, relatively low overhead
		alternative to a hash, which can produce false positives, but
		not false negative. The hot path is pretty much guaranteed to be found,
		but a cold path could be mis identified as a hot path.

		By adding decaying when the bloom filter is too full we can dynamically
		identify a changing hot path.

		Guesstimating that a pretty large (accurate) bloom filter with K at
		around 3-4 and max_fill set fairly low should provide good results with
		relatively low overhead.

=head1 CV tracing

Allow conditional tracing of ENTERSUB based on the CV it will invoke, instead
of/in addition to the PL_op of the ENTERSUB.


