The subr_blist_init function has two purposes - to compute the number of nodes to allocate for the list, and to initialize them. The computation can be done much more quickly, by identifying the terminating node, if any, at every level of the tree and then summing the number of nodes at each level that precedes the topmost terminator. The initialize can also be done quickly, since settings at the root mark the tree as all-allocated, and only a few terminator nodes need to be marked in the rest of the tree.
The allocation of the blist takes places in two pieces, but there's no good reason to do so, when a single allocation is sufficient, and simpler.