https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86071
Bug ID: 86071 Summary: -O0 -foptimize-sibling-calls doesn't optimize Product: gcc Version: 8.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: Hi-Angel at yandex dot ru Target Milestone: --- # Steps to reproduce: $ cat test.cpp struct Node { Node* children; }; const Node& descend(const Node& node) { if (!node.children) { return node; } else // not a leaf return descend(*node.children); } int main() { Node end; Node ring = Node{new Node{&end}}; end.children = ˚ descend(ring); } $ g++ test.cpp -o a -O0 -g3 -foptimize-sibling-calls $ ./a [1] 21291 segmentation fault (core dumped) ./a Running under gdb shows that crash is because of exhausted stack, i.e. tail-recursion optimization didn't work. # Additional information This one testcase actually does work upon replacing -O0 with -O3. However, I also have a bit bigger testcase, where tail-recursion optimization doesn't work even with -O3. I wonder, if it's worth a separate bug.