I did not use your base, fortunately
ok, so here are the results of my last investigations.
I started with a base that has practically no modification compared to master code, except some statements to silence “unused variables” warnings.
In order to make gcc 9.3 actually inline all code with -Os, we must set --param max-inline-insns-size to at least 31 (more will not harm that much I guess).
=> bad: 01 juno
-Os --param max-inline-insns-size=31
=> ok: 01 juno, 17 flat eric
=> bad: 41 FmFmFmFm
-Os --param max-inline-insns-size=31 osc::RenderFm with UPDATE_PHASE_MORE_REGISTERS
=> ok: 41 FmFmFmFm good
=> bad: 72 Canada
=> ok: 72 Canada
=> bad: 84 bad taste
-O2 osc::RenderCz* with UPDATE_PHASE_MORE_REGISTERS
=> ok: 84 bad taste
=> bad: 110 Voxelito
I could not make Voxelito work unfortunately. I had a look to the generated assembly code, to no avail. There are some differences (more registers pushed on the stack, could not get rid of them with -fomit-frame, or some code moved around), but nothing obvious to my untrained eyes.
I have some hypotheses in mind, but they might be highly worthless…
So it’s better, but we are not quite there yet. I think I’ll pause for a while, and see if you @machfour or someone else come with fresh ideas and skills.