Recursion broken recently by `-OoDeadValues` in mainline FPC
Summary
-OoDeadValues causes recursion based counter to not increment.
This is recent, a couple weeks ago in mainline FPC -OoDeadValues was not causing recursion to fail.
System Information
- Operating system: Linux (Arch Linux)
- Processor architecture: x86-64
- Compiler version: 3.3.1-12090-g12aa4860
- Device: Computer
Steps to reproduce
Given the following:
procedure pr1(const i, final: integer);
var i0: integer;
procedure pr2(const i1: integer);
begin
if i1 > final then exit;
if i0 > (final*2) then exit;
writeln(i0, ' ', i1);
inc(i0);
pr2(i1+1);
end;
begin
i0 := i;
pr2(i);
end;
begin
pr1(1, 5);
end.
Compiled as follows:
fpc -gl -gw3 -Xi -Sm -Sg -Os -Mobjfpc -Sh \
-MfunctionReferences -ManonymousFunctions -MadvancedRecords \
-McVar -MimplicitFunctionSpecialization -MhintDirective \
-OoPeepHole -OoTailRec -OoRemoveEmptyProcs -OoConstProp \
-vnewh -Sewh \
-OoDFA -OoCSE -OoUnusedPara -OoDeadStore \
-OoDeadValues \
./recurse.pas
With this compiler output:
Hint: Start of reading config file /home/dev/fpc_usr/lib/fpc/etc/fpc.cfg
Hint: End of reading config file /home/dev/fpc_usr/lib/fpc/etc/fpc.cfg
Free Pascal Compiler version 3.3.1 [2022/11/08] for x86_64
Copyright (c) 1993-2022 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling ./recurse.pas
Linking recurse
21 lines compiled, 0.1 sec, 156848 bytes code, 1139976 bytes data
2 hint(s) issued
What is the current bug behavior?
When run, produces the following:
1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 1
10 1
i1 is not incremented.
Terminal condition for the recursion is supposed be based on i1.
Instead it is based on the fallback condition for i0.
What is the expected (correct) behavior?
When compiled the same as above but without the -OoDeadValues, when run the following is produced:
1 1
2 2
3 3
4 4
5 5
i1 is incremented.
Terminal condition for the recursion is correctly based on i1
Fallback terminal condition for the recursion based on i0 is not needed.
When compiled as follows with stable released FPC:
fpc \
-gl -gw3 -Xi -Sm -Sg -Os -Mobjfpc -Sh \
-MadvancedRecords \
-McVar -MhintDirective \
-OoPeepHole -OoTailRec -OoRemoveEmptyProcs -OoConstProp \
-OoDFA -OoCSE -OoDeadStore -OoDeadValues \
-vnewh -Sewh ./recurse.pas
With the following compiler output:
Hint: Start of reading config file /etc/fpc.cfg
Hint: End of reading config file /etc/fpc.cfg
Free Pascal Compiler version 3.2.2 [2022/08/31] for x86_64
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling ./recurse.pas
Linking recurse
21 lines compiled, 0.1 sec
2 hint(s) issued
Produces the following when run:
1 1
2 2
3 3
4 4
5 5