Todos los compiladores lo hacen, y los que no lo hacen son los "malos". Te explico el porque:
a=1;
a=5;
si el compilador no suprime a=1; entonces no esta optimizando nada, al final la variable tomara el valor de 5, el valor de 1 para que lo quieres?? En caso de que sea una variable volatil por ejemplo usada en una interrupcion, o bien usada por otra funcion desde el exterior entonces el compilador no te suprime esa parte, es por eso que hay que declara la variable como "volatile"
Como ya te digo, todos los compiladores lo hacen, y si pones una optimizacion alta entonces te alteran bastante mas el codigo para obtener un mayor rendimiento todo esto sin alterar el funcionamiento del programa!.
A mi me ha pasado en microchip, freescale, el ccs de TI segun el forero, en visual studio.... Realmente no conozco ninguno que no lo haga, quizas un compilador gratis tipo gcc no optimiza asi de tal forma, pero si pagas 4000$ por un compilador (o lo usas en modo trial) creeme que te modifica el codigo de tal manera que ahorra bastantes instrucciones, tamaño de codigo y ademas no altera el funcionamiento del programa, es como en una multiplicacion, el orden del factor no altera el producto...
Para empezar, si escribes:
a=1;
a=5;
si lo haces por error, el malo es el usuario que programa y la opción de optimización debería deshabilitarse automáticamente para esos usuarios, porque ni la merecen

. Ahora, si lo has escrito adrede, por el motivo que sea, entonces el compilador te jode cuando te suprime el a = 1;.
A mi Visual Studio, bajo C#.NET o VB .NET, no me lo ha hecho. Incluso con casos en los que he querido hacer algo poco sentido, como por ejemplo:
if (b == 57)
b = b;
para poder poner un breakpoint en la línea b = b. No me lo ha suprimido. El CCS alguna vez recuerdo me habrá lanzado un mensaje de "code has no effect" o simil, pero no tengo memoria que haya suprimido algo. Entiendo perfectamente lo que es una variable volatile, no sé por qué tanta insistencia con eso. Y jamás el Visual Studio me ha saltado entre líneas como le sucede a elmasvital. Entonces según tu teoría, si hago:
x = 0;
x = 1;
x = 2;
x = 3;
x = 4;
x = 5;
que equivale a:
for(x=0;x<5;x++);
tendrían que ser suprimida en ambos casos por optimización y reemplazadas directamente por:
x = 5;
cuando todos sabemos que hacer un for(;

es altamente normal para generar pequeñas demoras. La optimización destruiría la demora.
A mi parecer, el compilador debería abocarse a mejorar la optimización de cada línea de código, pero sin suprimir o alterar su orden.
Que compilador de ARM usas Burno? Y que fabricante. Igual hay mejores opciones que las que estoy barajando ahora mismo.
Despues de escribir esto y de modificar la optimización a 0 he de decir que en algunos casos el compilador sigue haciendo lo mismo. En muchas menos ocasiones pero lo sigue haciendo. La verdad es que para debugear es un fastidio. Lo que ya no se si realmente es ya problema del compilador o de la implementación con eclipse donde se relaciona el asm y el c.
Ahora estoy utilizando GCC para micros ARM de NXP. A mi parecer la optimización es excelente. He programado ARM Cortex M0-M3 en assembly y aún conociendo a fondo el set de instrucciones, cuando miro el código generado por el compilador, no hay mucho o nada para optimizar. Aún así, me la paso debuggeando y jamás he visto que el debugger suprima o salte líneas.
Saludos