extra instructions lost from -O0 to -O1

Thomas A.M. Bernard t.bernard@uva.nl
Fri Sep 12 13:49:00 GMT 2008


Ian Lance Taylor wrote:
> "Thomas A.M. Bernard" <t.bernard@uva.nl> writes:
>
>   
>> I guess I am missing something here. I've tried the following as Paolo
>> suggested,
>>
>> (define_insn "setallocate"
>> [(unspec_volatile:DI [(match_operand:DI 0 "general_operand" "r")]
>>                                 UNSPEC_ALLOCATE)]
>>  ""
>>  "allocate %0\t\t#TCB_INSTRUCTIONS"  [(set_attr "type" "multi")])
>>
>> When flag -O0 is on, everything's fine. But when flag -O1 is engaged,
>> the instruction is still omitted. Something missing ?
>>     
>
> The only that gcc will remove an unspec_volatile instruction is if it
> is on a code path which is never executed.
>   
> Look at the RTL dump files (from, e.g., -fdump-rtl-all), see where it
> is disappearing, and why.
>   
With this pattern for setallocate, when the flag -O1 is engaged, the 
instruction is already omitted just at the expansion. As Ian mentioned, 
I suspect the problem comes from the fact that the compiler thinks this 
code path won't be executed. I presume this should be done at the CFG 
level. I added in CFG a "node" which describes 'setallocate' Any clue to 
say explicitly this will be executed in any case ?

Thanks,
Thomas



More information about the Gcc mailing list