Это выглядит вполне разумно для меня. Когда у вас повышенная оптимизация, компилятор может и обычно будет дико упорядочивать операторы. Ваши два основных предложения идентичны, за исключением их типизации - так что компилятор вполне правдоподобно объединяет пути выполнения, и они различаются только там, где это действительно важно.
Это проблема, только если фактический наблюдаемый эффект отличается от того, что предполагалось.
В любом случае, за оптимизированным кодом всегда трудно следовать с помощью отладчика, именно из-за эффектов переупорядочения.
Кстати, если ваш код взаимодействует с реальным оборудованием, вы можете объявить переменные flash_copy_*_address
как volatile
. Это подсказка компилятору, что память, на которую они указывают, не обязательно ведет себя нормально и заставляет ее быть более консервативной с ее оптимизацией.