> Hi,
> 
> this fixes an over-optimization of the GIMPLE optimizer, whereby two 
> otherwise 
> identical calls to a pure function present in different EH regions are CSEd, 
> which changes the semantics of the program because the second EH handler is 
> not invoked:
> 
>   begin
>     I := F(0);
>   exception
>     when E => N := N + 1;
>   end;
> 
>   begin
>     I := F(0);
>   exception
>     when E => N := N +1;
>   end;
> 
> Two passes (DOM and FRE) can optimize this construct and a test modelled on 
> stmt_can_throw_internal is used to coax them into not doing so.
> 
> Tested on x86_64-suse-linux, OK for the mainline?

Can't I have sometihng like

 loop (i as iterator)
   begin
     I := F(0);
   exception
     when E => N := N + 1;
   end;

here I would expect PRE to discover I as loop invariant that will cause 
exception to be called just once, not at every iteration of loop?
Can't the same happen for non-call expcetions?

Honza

Reply via email to