Fix recursion discovery in ipa-pure-const
Thu Nov 11 14:53:39 GMT 2021
> On Thu, Nov 11, 2021 at 2:41 PM Jan Hubicka via Gcc-patches
> <email@example.com> wrote:
> > Hi,
> > We make self recursive functions as looping of fear of endless recursion.
> > This is done correctly for local pure/const and for non-trivial SCCs in
> > callgraph, but for trivial SCCs we miss the flag.
> > I think it is bad decision since infinite recursion will run out of stack,
> Note it might not always in case we can eliminate the tail-recursion or avoid
> stack use by the recursion by other means. So I think it is conservatively
I don't know. If function is pure and has infinite recursion in it it
means that it can only run forever without side effects if it gets lucky
and we tail-recurse it. There are no other means avoid the stack use from
First i think code relying on tail-recurse optimization to not run out
of stack is not strictly valid in C/C++ other languages we care.
Also in C++ there is the forced progression which makes even the tail
optiimzed code invalid.
I think in high level code such recursive accessors used for no good
reason are not that infrequent. Also we had this bug in tree probably
forever since LOOPING_PURE_CONST was added and no one complained ;)
Relaxing this rule breaks some testcases, but odd ones - they are
infinitely self-recursive builtin implementations where we then both
prove function as noreturn & later optimize builtin to constant
so the assembly matching does not see expected thing.
More information about the Gcc-patches