WIP: Hoist removed calls out when removing params.
Since function calls may modify some global, they have to appear before
the function call that they are within. This causes some issues:
1) What if you have a nested function call like:
f1(f2(side_effects()), side_effects());
If you simply hoist both side_effects calls out if they're unused:
side_effects();
side_effects();
f1(f2());
Now f2 will see the state after 2 side_effects() calls, when it should
only see after one, so the behavior may change.
2) This applies to more than function calls
Because of these issues, it may be smartest to just not lift out
anything that may have side effects. Note that this probably still
allows the impactful cases.