>>106505734
This is in main.c, slightly more understandable this way, to understand the passes done on each function.
You can see that filluse() is called before every pass basically. This is about the SSA data structure. Each instruction struct has operand fields pointing to (referencing via an index) the variable definitions (variable assignment or temporaries) it uses. For example:
a = 1
b = 2
c = add a, b # c = a + b
So naturally, it contain explicit use -> def chains, which are useful for analysis and transformations. Some passed make use of def->use chains however, and here in QBE it's maintain by an external data structure that must be re-generated. It's easier to manipulate the SSA this way, otherwise every single transformation pass should take care to maintain the def->use chains. def->use chains are a pain because each definition can have multiple users, so each instruction struct requires a vector for storing them. On the other hand, each instruction only need a single use->def chain per operand. Each operand requires a single pointer/reference and that's it.