Да, оптимизатор иногда задалбывает вместе с предупреждениями. Особенно "любимая" ситуация - нужно прочитать регистр периферии "в никуда". И начинается... То просто предупреждение, что переменная не используется после присвоения, то еще хуже - просто соптимизировать вплоть до удаления чтение регистра (а что? результат-то не используется!). В каком-то варианте пришлось писать код типа:
if (RGSTAT != 0) __no_operation();