Как кто-то сказал, но, к сожалению, его голосовали (не уверен, почему он удалил свой ответ), компилятор может делать все, что угодно, при условии, что наблюдаемое поведение такое же, как если бы он не делал ничего другого.
Это саморасширяющееся, что если ваша функция пишет в ссылку, и глобальная переменная была передана в качестве аргумента функции, а глобальная была позже напечатана после того, как функция вернулась, или что-то еще было сделано, то если компилятор измените соглашение о передаче параметров, компилятору будет сложнее доказать, что вы по-прежнему наблюдаете то же самое поведение. Если компилятор не может доказать это, он не может выполнить желаемую оптимизацию.
Так что, какой бы ни был следующий вопрос, просто подумайте: «Он может делать что угодно, пока я этого не замечу».