В листингах статьи "Скользкая дорожка для поклонников volatile" однозначно косяк компилятора. То что есть в ассемблерных листингах компилятор не имел права делать! Пинать афтароф ГЦЦ! Рекомендация писать *((volatile int*)base_addr + 0xff) = 0;
фальшивая. Это присваивание а проблема при изменении volatile переменной.
Барьер сродни гильотине против перхоти. Зачем скидывать ВСЕ регистры если критична только одна переменная ?
Но проблема серьезная - в современных процессорах многоуровневые кэши, переупорядочивание инструкций, спекулятивное исполнение, агрессивная предвыборка, глубокая "прозрачная" буферизация и уж с этим компилятор и даже ассемблер вообще сделать ничего не могут.