[Bug tree-optimization/48837] New: Wrong optimization of recursive function calls
personal@e-maxx.ru
gcc-bugzilla@gcc.gnu.org
Sat Apr 30 21:26:00 GMT 2011
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48837
Summary: Wrong optimization of recursive function calls
Product: gcc
Version: 4.6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: personal@e-maxx.ru
Created attachment 24153
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=24153
The example program - it should output "ans = 1", but outputs "ans = 0" in -O2
The program attached outputs "global ans = 1" if compiled without
optimizations, and "global ans = 0" with -O2 set.
Moreover, if we insert debug-output into the recursive function, it becomes
working right:
//cout << "query = " << ans << endl;
// ^^^^^ UNCOMMENT THIS LINE TO MAKE THE PROGRAM WORK OK
If we uncomment the line, the program outputs "global ans = 1" both with -O2
and without it.
Unfortunately, I couldn't make the test program very simple - optimizer works
OK on simple programs, but when we have a complex recursion calls - it starts
making wrong code.
To make you understand it better - there are some additional debug-outputs.
For example, the right program flow results in the following output:
call auxillary (t[9], 123):
auxillary = 1
call auxillary (t[5], 123):
auxillary = 0
global ans = 1
When we compile with -O2, the output becomes:
call auxillary (t[9], 123):
auxillary = 1
call auxillary (t[5], 123):
auxillary = 0
global ans = 0
(note that from code we can see that query() returns sum of all recursive
answers - then how can it return 0, if one auxillary() returned 1???)
More information about the Gcc-bugs
mailing list