Bug 14952 – Redundant REX.W before FSTP confuses Valgrind

Status
RESOLVED
Resolution
FIXED
Severity
regression
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
x86_64
OS
All
Creation time
2015-08-23T22:15:00Z
Last change time
2015-08-28T04:04:15Z
Keywords
wrong-code
Assigned to
nobody
Creator
dlang-bugzilla

Comments

Comment #0 by dlang-bugzilla — 2015-08-23T22:15:07Z
For this code: //////// test.d //////// real f() { return 123; } void main() { auto x = f() / f(); } //////////////////////// DMD outputs the following x86_64 opcodes: 55 push rbp 48 8B EC mov rbp, rsp 48 83 EC 20 sub rsp, 20h 48 83 EC 20 sub rsp, 20h E8 87 FF FF FF call _D4test1fFZe 48 83 C4 20 add rsp, 20h 48 83 EC 20 sub rsp, 20h 48 DB BD E0 FF FF FF fstp [rbp+var_20] E8 73 FF FF FF call _D4test1fFZe 48 83 C4 20 add rsp, 20h 48 DB AD E0 FF FF FF fld [rbp+var_20] DE F1 fdivrp st(1), st DB 7D F0 fstp [rbp+var_10] 31 C0 xor eax, eax 48 8D 65 00 lea rsp, [rbp+0] 5D pop rbp C3 retn Note the "48 DB BD" sequence. As I understand, the 48 prefix (REX.W) is redundant in that situation, and it also confuses Valgrind: vex amd64->IR: unhandled instruction bytes: 0x48 0xDB 0xBD 0x10 0xFE 0xFF 0xFF 0x48 vex amd64->IR: REX=1 REX.W=1 REX.R=0 REX.X=0 REX.B=0 vex amd64->IR: VEX=0 VEX.L=0 VEX.nVVVV=0x0 ESC=NONE vex amd64->IR: PFX.66=0 PFX.F2=0 PFX.F3=0 ==20966== valgrind: Unrecognised instruction at address 0x4de3c7. ==20966== at 0x4DE3C7: Div(Type*, Expression*, Expression*) (in /home/digger/2/work/build/bin/dmd) ==20966== by 0x5BA95A: Expression_optimize::OptimizeVisitor::visit(DivExp*) (in /home/digger/2/work/build/bin/dmd) ==20966== by 0x566C64: DivExp::accept(Visitor*) (in /home/digger/2/work/build/bin/dmd) ==20966== by 0x5B9223: Expression_optimize(Expression*, int, bool) (in /home/digger/2/work/build/bin/dmd) ==20966== by 0x54748C: Expression::optimize(int, bool) (in /home/digger/2/work/build/bin/dmd) ==20966== by 0x4EC7E1: implicitConvTo::ImplicitConvTo::visit(Expression*) (in /home/digger/2/work/build/bin/dmd) ==20966== by 0x5EA489: Visitor::visit(BinExp*) (in /home/digger/2/work/build/bin/dmd) ==20966== by 0x5EA981: Visitor::visit(DivExp*) (in /home/digger/2/work/build/bin/dmd) ==20966== by 0x566C64: DivExp::accept(Visitor*) (in /home/digger/2/work/build/bin/dmd) ==20966== by 0x4EC747: implicitConvTo(Expression*, Type*) (in /home/digger/2/work/build/bin/dmd) ==20966== by 0x546414: Expression::implicitConvTo(Type*) (in /home/digger/2/work/build/bin/dmd) ==20966== by 0x58A972: ExpInitializer::semantic(Scope*, Type*, NeedInterpret) (in /home/digger/2/work/build/bin/dmd) Because DMD is now used to build DMD, this manifests as a regression, and interferes with services such as http://digger.k3.1azy.net/trend/ which rely on the ability of running DMD under Valgrind to gather statistical information.
Comment #1 by bugzilla — 2015-08-28T00:46:58Z
Comment #2 by github-bugzilla — 2015-08-28T02:32:09Z
Commits pushed to master at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/20938d46c4ba8aafd9ff40965484555e58ce0e37 fix Issue 14952 - Redundant REX.W before FSTP confuses Valgrind https://github.com/D-Programming-Language/dmd/commit/b570bf975f4e85ad6572720f7d4769ad8bee62a7 Merge pull request #4967 from WalterBright/fix14952 [REG] fix Issue 14952 - Redundant REX.W before FSTP confuses Valgrind
Comment #3 by github-bugzilla — 2015-08-28T04:04:15Z
Commit pushed to dmd-1.x at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/098403aa9858201f2e664cf8d6cb33c0f697bff8 Merge pull request #4967 from WalterBright/fix14952 [REG] fix Issue 14952 - Redundant REX.W before FSTP confuses Valgrind