1. We check the IR first to identify if we may or may not be able to treat the loop iterator as a z3 variable in terms of cost and feasibility. 2. `_make_signature` can store the canonical representation into a bitvector instead of a string. 3. We can make the signature database a trie instead without hashing
_make_signaturecan store the canonical representation into a bitvector instead of a string.