https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92559
Bug ID: 92559
Summary: Returning std∷map breaks tail-recursion optimization
Product: gcc
Version: 9.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: Hi-Angel at yandex dot ru
Target Milestone: ---
The following code, exploiting tail-recursion, does not get optimized into a
loop with -O3 option, so it crashes if you try to run it.
#include <map>
using MyMap = std::map<unsigned, unsigned>;
MyMap foo(MyMap m) {
if (m[0] == 0)
return m;
else {
m[0] -= 1;
return foo(m);
}
}
int main() {
MyMap m = {{0, 999999}};
foo(m);
}
While debugging GCC, I found that `find_tail_calls()` function quits at this
code¹:
/* If the statement references memory or volatile operands, fail. */
if (gimple_references_memory_p (stmt)
|| gimple_has_volatile_ops (stmt))
return;
1:
https://github.com/gcc-mirror/gcc/blob/38f05dc5db9241d3de8041a683972f086edce561/gcc/tree-tailcall.c#L464
I haven't found any duplicates of this so far.