[Issue 16087] New: Alignment (.alignof) and stack space incorrect for SIMD types.
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Sat May 28 09:33:07 PDT 2016
https://issues.dlang.org/show_bug.cgi?id=16087
Issue ID: 16087
Summary: Alignment (.alignof) and stack space incorrect for
SIMD types.
Product: D
Version: D2
Hardware: x86_64
OS: Linux
Status: NEW
Keywords: SIMD, wrong-code
Severity: blocker
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: Marco.Leise at gmx.de
The following code compiled and run with dmd-2.071 prints:
SIMD vector types inherit their base type's alignment:
float8.alignof yields 4 but should yield 32.
void16.alignof yields 1 but should yield 16.
When embedded, a float4 exposes some hidden alignment, as it changes to 16.
The float8 needs a 32 byte alignment though or we SEGFAULT as soon as we load
c[0] or c[1].
Even worse, the stack space occupied by these 32 byte vectors is only 16!
-------------------------
void main()
{
import core.simd;
import std.stdio;
import std.math;
union Matrix4x4 { float[16] a; float4[4] b; float8[2] c; alias a this; }
float8 onStackA;
float8 onStackB;
writeln("SIMD vector types inherit their base type's alignment:");
writefln("float8.alignof yields %s but should yield 32.", float8.alignof);
writefln("void16.alignof yields %s but should yield 16.", void16.alignof);
writefln("When embedded, a float4 exposes some hidden alignment, as it
changes to %s.", Matrix4x4.alignof);
writeln("The float8 needs a 32 byte alignment though or we SEGFAULT as soon
as we load c[0] or c[1].");
writefln("Even worse, the stack space occupied by these %s byte vectors is
only %s!",
float8.sizeof, abs(cast(ptrdiff_t)&onStackB -
cast(ptrdiff_t)&onStackA));
}
-------------------------
Compiled programs with too little stack space or incorrect alignment of SIMD
types crash.
--
More information about the Digitalmars-d-bugs
mailing list