[Issue 17676] New: [REG 2.075] bad inlining of functions with multiple return values
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Sun Jul 23 07:01:14 PDT 2017
https://issues.dlang.org/show_bug.cgi?id=17676
Issue ID: 17676
Summary: [REG 2.075] bad inlining of functions with multiple
return values
Product: D
Version: D2
Hardware: x86_64
OS: Windows
Status: NEW
Severity: regression
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: r.sagitario at gmx.de
import core.stdc.stdio;
__gshared bool bgEnable = 1;
void smallAlloc() nothrow
{
fullcollect();
}
size_t fullcollect() nothrow
{
if(bgEnable)
return fullcollectTrigger();
return fullcollectNow();
}
size_t fullcollectNow() nothrow
{
pragma(inline, false);
printf("fullcollectNow\n");
return 1;
}
size_t fullcollectTrigger() nothrow
{
pragma(inline, false);
printf("fullcollectTrigger\n");
return 0;
}
void main()
{
smallAlloc();
}
Without inlining, this just prints "fullcollectTrigger", while compiling with
-inline causes both messages to be printed.
The assembly of smallAlloc looks like this (dmd -O -inline -release):
_D7reg681510smallAllocFNbZv:
0000000000000000: 55 push rbp
0000000000000001: 48 8B EC mov rbp,rsp
0000000000000004: 48 83 EC 20 sub rsp,20h
0000000000000008: 40 80 3D 00 00 00 cmp byte ptr
[_D7reg68158bgEnableb],0
00 00
0000000000000010: 74 05 je 0000000000000017
0000000000000012: E8 00 00 00 00 call
_D7reg681518fullcollectTriggerFNbZm
0000000000000017: E8 00 00 00 00 call
_D7reg681514fullcollectNowFNbZm
000000000000001C: 48 8B E5 mov rsp,rbp
000000000000001F: 5D pop rbp
0000000000000020: C3 ret
Note the missing jump between the two calls. If an "else" is inserted between
the two return statements in fullCollect(), it works correctly.
This doesn't happen with dmd 2.074. Introduced by
https://github.com/dlang/dmd/pull/6815
--
More information about the Digitalmars-d-bugs
mailing list