On x86_64 systems this assert fails because feqrel returns to 0. assert(feqrel(real.min_normal/8,real.min_normal/17)==3);
Here is the link into Phobos: https://github.com/D-Programming-Language/phobos/blob/master/std/math.d#L3634
It works when a dummy function call is inserted before "if (pd[F.EXPPOS_SHORT] == 0)" inside feqrel.
This sounds like a compiler bug. Does it still fail on 2.057?
(In reply to comment #3) > Does it still fail on 2.057? Works on 32 bit Linux, fails on 64 bit Linux. Test program: import std.math; void main() { assert(feqrel(real.min_normal/8,real.min_normal/17)==3); }
Original title: feqrel fails assert in std.math on x86_64 systems Reduced test case shows it is a backend bug. The common subexpression *px gets extended to int when calculating b. Inside the assert it is treated as *cast(int *)px, so that it picks up x[1] instead of just x[0]. It seems to only apply to comparisons with 0. Subtle and disastrous, raising severity to blocker. void main() { ushort[2] x = void; x[0] = 0; x[1] = 0x1234; ushort *px = &x[0]; uint b = px[0]; // this causes the next line to fail assert(px[0] == 0); } It generates cmp dword ptr -010h[RBP],0 should be word ptr, which doesn't exist in 64bit.
https://github.com/D-Programming-Language/dmd/pull/937
My pull request is wrong. The correct fix is in cgcod.c, line 1795. In moving to 64 bit, commit 3cdb9f520e0bac17f6da00ef9de86c81e23429aa made this change: c = genc(NULL,0x81 ^ byte,modregrm(2,7,BPRM), FLcs,i, FLconst,(targ_uns) 0); - if (REGSIZE == 4 && sz == 2) + if (I32 && sz == 2) c->Iflags |= CFopsize; } But this is wrong, it should be + if ((I32 || I64) && sz == 2) This code is now in cod3.c, testcse(), line 1795.
Fixed pull request. https://github.com/D-Programming-Language/dmd/pull/938
Commit pushed to master at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/7c2ea37c476a2d7a289f54cbf1ee0e692d7a69a0 Fix issue 5809: [64 bit] wrong code for *p==0, when widening conversion occurs Bug was introduced in commit 3cdb9f52, but it never worked on 64bits, so it is not a regression.
AltStyle によって変換されたページ (->オリジナル) / アドレス: モード: デフォルト 音声ブラウザ ルビ付き 配色反転 文字拡大 モバイル