Optimizations with avr-gcc

Niklas Gürtler profclonk@gmail.com
Thu Jun 26 06:40:00 GMT 2014


That's because all I/O Registers, including DDRB, are declared as
"volatile". Accesses to it won't be optimized.
For example this code would turn on an I/O pin for one cycle:
PORTB |= 1;
PORTB &= ~1;
If the compiler considered the first instruction as useless and
optimized it out, the pin would never be turned on. So, PORTB and the
others are declared as volatile to prevent this optimization.

On 25.06.2014 17:23, Sandeep K Chaudhary wrote:
> Hi guys,
>
> I have a small program with the following statements -
>
> DDRB = 0x1;
>
> DDRB = DDRB<<2;
>
> DDRB += 5;
>
> I am compiling it with "avr-gcc -mmcu=atmega8 -O3 -fdump-tree-all
> ledchase.c". As you can see, I am dumping the content after each pass
> in avr-gcc.
>
> In the dumps, I see that neither statement 2 nor 3 is optimized i.e. I
> don't see "DDRB = 4 (from 2nd statement)" or "DDRB = 5 (from 3rd
> statement)".
>
> My question is - Is it possible to achieve such optimizations with
> avr-gcc? if not, why?
>
> Please let me know. It would help me a lot. Thanks in advance !
>
> Thanks and regards,
> Sandeep.



More information about the Gcc-help mailing list