This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Empty loops removal (Was Re: Some extra decorations)


> Jan Hubicka:
> 
> >There are also few annotations that I would like to add to functions
> >declared in headers where GCC don't know if they are finite so it is not
> >sure it can remove call to them even if it can prove there are no side
> >effects otherwise.
> 
> Hi,
> 
> You may be interested in 6.5p5 of the latest standard draft (N2857) which 
> states:
> 
> "A loop that, outside of the for-init-statement in the case of a for 
> statement,
> - makes no calls to library I/O functions, and
> - does not access or modify volatile objects, and
> - performs no synchronization operations (1.10) or atomic operations 
> (Clause 29)
> may be assumed by the implementation to terminate. [ Note: This is intended 
> to allow compiler transformations, such as removal of empty loops, even 
> when termination cannot be proven. -end note ]"
> 
> This new rule has been introduced by the memory model changes. 

This indeed is interesting :)  It would make those pure/const
annotations on STL loops redundant and save us some SCEV analyzis in
pure/const pass as well as in empty loop removal and CD-DCE.  (in fact
they are kind of optimization challenge as by inlining function we lose
the hint, so I would need to work out some extra code maintaining info
about finiteness of the function).

On mainline I enabled infinite loop removal at
-funsafe-loop-optimizations.  I would suggest adding
-fempty-loops-terminate and make it default for C++? It does not apply
for C, right?

What about loops formed by infinite recursion?

Honza


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]