Why doesn't the compiler use directly LSR
According to C language specification any value whose size is less than the size of int (depends on the particular compiler; in your case int is 16-bits wide) involved in any operation (in your case &gt;&gt;) is upcast to an int before the operation.
This behaviour of the compiler is called integer promotion.

And that's exactly what the compiler did: 


r19=0 is the MSByte of the integer promoted value of data.  
(r19, r18) represents the total integer promoted value of data that is then shifted right by one bit by asr r19 and ror 18.  
The result is then implicitely cast back to your uint8_t variable data:mov r24, r18, i.e. the MSByte in r19 is thrown away.


Edit:
Of course the complier could optimize the code.
Trying to reproduce the problem I found that at least with 
avr-gcc version 4.9.2 the problem doesn't occur.
It creates very efficient code, i.e. C-line 
 data &gt;&gt;= 1; gets compiled to just one single lsr r24 instruction.
So maybe you are using a very old compiler version.