Skip to content

Commit

Permalink
Merge pull request #8052 from WalterBright/fix18534
Browse files Browse the repository at this point in the history
fix Issue 18534 - Wrong code for ?: operator when compiling with -O
  • Loading branch information
wilzbach committed Mar 20, 2018
2 parents 0d18900 + f9ed340 commit cf2d493
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 5 deletions.
20 changes: 15 additions & 5 deletions src/dmd/backend/cod2.c
Expand Up @@ -1998,9 +1998,19 @@ void cdcond(CodeBuilder& cdb,elem *e,regm_t *pretregs)
targ_size_t v1,v2;
int opcode;

retregs = *pretregs & (ALLREGS | mBP);
if (!retregs)
retregs = ALLREGS;
if (sz2 != 1 || I64)
{
retregs = *pretregs & (ALLREGS | mBP);
if (!retregs)
retregs = ALLREGS;
}
else
{
retregs = *pretregs & BYTEREGS;
if (!retregs)
retregs = BYTEREGS;
}

cdcmp_flag = 1;
v1 = e21->EV.Vllong;
v2 = e22->EV.Vllong;
Expand Down Expand Up @@ -2046,15 +2056,15 @@ void cdcond(CodeBuilder& cdb,elem *e,regm_t *pretregs)
{
v1 -= v2;
cdb.genc2(opcode,grex | modregrmx(3,4,reg),v1); // AND reg,v1-v2
if (I64 && sz1 == 1 && reg >= 4)
if (I64 && sz2 == 1 && reg >= 4)
code_orrex(cdb.last(), REX);
if (v2 == 1 && !I64)
cdb.gen1(0x40 + reg); // INC reg
else if (v2 == -1L && !I64)
cdb.gen1(0x48 + reg); // DEC reg
else
{ cdb.genc2(opcode,grex | modregrmx(3,0,reg),v2); // ADD reg,v2
if (I64 && sz1 == 1 && reg >= 4)
if (I64 && sz2 == 1 && reg >= 4)
code_orrex(cdb.last(), REX);
}
}
Expand Down
18 changes: 18 additions & 0 deletions test/runnable/test18534.d
@@ -0,0 +1,18 @@
/* REQUIRED_ARGS: -O
* PERMUTE_ARGS:
*/

// https://issues.dlang.org/show_bug.cgi?id=18534

auto blah(char ch) { return ch; }

auto foo(int i)
{
return blah(i ? 'A' : 'A');
}

void main()
{
auto c = foo(0);
assert(c == 'A');
}

0 comments on commit cf2d493

Please sign in to comment.