Компиляторы с макс. оптимизацией находят больше предупреждений, которые часто, фактически, мои латентные ошибки. Так что рекомендую использовать макс. оптимизацию, лишь за исключением вынужденного использования чужих библиотек, которые с оптимизацией не собираются или не работают.
К примеру, свежий OpenOCD собрать с оптимизацией -O3 и -Werror уже нельзя - несколько модулей имеют массу потенциально неинициализированных значений и даже вылеты за границы массива.
P.S. По сути ответа: уверен, что с максимальной оптимизацией, как ни пиши, код будет одинаково мал. И можно так, и можно сяк. Если побочный эффект от выполнения кода один и тот же, то и код будет, скорее всего, один и тот же. Важно избегать волатильных переменных. Часто экранирую сложную логику, переводя volatile-значение в не переменчивое временное, чтобы компилятор имел свободу на время вычислений не перечитывать значение по конкретному адресу.