Durante o processo de otimização de código, ferramentas como LLVM e GCC aplicam uma série de técnicas para otimizar o fluxo de controle, a alocação de memória e o uso de registradores. Suponha que você esteja otimizando um programa que realiza operações matemáticas intensivas e que contém loops redundantes. O compilador está configurado para aplicar otimizações automáticas e detectar expressões que podem ser simplificadas, assim como gerenciar eficientemente os registradores do processador. Com base no processo de otimização de código, quais das seguintes afirmações refletem corretamente as técnicas aplicadas durante a otimização? I. A multiplicação por potências de 2 pode ser substituída por operações de deslocamento de bits, o que melhora o desempenho em arquiteturas específicas. II. A alocação eficiente de registradores permite ao compilador usar variáveis temporárias, evitando o uso da memória principal para cada cálculo intermediário. III. O compilador elimina ciclos de controle invariáveis movendo-os para fora dos loops, melhorando a eficiência da execução. IV. Saltos incondicionais sempre são removidos, independentemente de sua função no código, para garantir uma