Lo unico que yo expongo es lo siguiente:
-El compilador elimina las partes inservibles de codigo, imagina que este es tu codigo:
a=1;
b=2;
funcion(a);
y la b no la utilizas en ningun sitio, en ese caso el compilador elimina el a=1 ya que no se utiliza.
Al igual que: a=1; while(a);
En este caso al ser a=1 el while se lo saltaria, como el compilador lo detecta entonces elimina ese codigo ya que no tiene ninguna utilidad.
-El compilador elimina las partes donde se asigna un valor, y luego se asigna otro valor (en caso de ser una variable temporal ya que si es volatile (por ejemplo PORTB en un pic) )la ejecuta si o si, la asignacion volatile hace que se ejecute en el orden que tu le indiques, asi mismo si tu utilizas esa variable como global y la utilizas en 2 funciones entonces el compilador la reconoce como volatile automaticamente.
a=10;
a=5;
funcion(a);
-El compilador ordena el codigo (asm) si decide que asi es mas eficaz, por ejemplo:
a=b;
c=10;
x=9;
z=b;
En ese caso tenemos 2 variables a las cual se les asigna 'b', en asm eso se traduciria en mover a un registro el valor de 'b' y luego mover ese registro hacia 'a'. Pues bien, no seria mas eficiente pasar el valor de 'b' a un registro y luego pasarlo del registro a: 'a' y 'z'?? asi ahorrariamos unos ciclos, aun tambien como existen muchos registros temporales es posible que lo haga en el mismo orden pero utilizando el mismo registro osea:
R1=b;
a=R1;
c=10;
x=9;
z=R1;
Pero hay casos que si cambia algunos ordenes
sin alterar el funcionamiento del programa, entonces asi lo hace, ocurre mucho en los switch().
El caso es que la pregunta del forero esta mas que contestada, es mas, se ha contestado el mismo con un documento del diseñador del compilador (el link que puso), ahi lo explica mucho mejor de lo que yo lo pueda hacer, pero es bastante mas tecnico.
Si algun dia me encuentro con un caso de que cambie el orden lo voy a poner aqui con una captura.
Te pongo otro ejemplo:
a=1;
funcion(a);
a=2;
funcion(a);
a=3;
funcion(a);
Se ejecutan en el mismo orden, simplemente queria exponer que en una optimizacion (0) hace a=1; a=2.... y en otra (3 o maxima depende del compilador) te lo hace incrementando la variable, asignar un valor a una variable en muchos procesadores puede costar 2 ciclos o mas (en otros solo 1), sin embargo incrementar una variable solo cuesta 1 ciclo por lo cual seria mas eficiente.
Perdon que me meta, vengo leyendo el hilo y me resulta intersante. Antes que nada NO se nada de optimizacion.
Una duda, si tu pones
a=1;
funcion(a);
a=3;
funcion(a);
a=2;
funcion(a);
y pones nivel de optimizacion 3. en que orden se ejecutará el código?
Saludos!