https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80491
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Target| |x86_64-*-*, i?86-*-*
Priority|P3 |P2
Status|UNCONFIRMED |NEW
Known to work| |5.4.1
Version|unknown |7.0.1
Keywords| |missed-optimization
Last reconfirmed| |2017-04-24
Ever confirmed|0 |1
Summary|Compiler regression for |[6/7/8 Regression] Compiler
|long-add case. |regression for long-add
| |case.
Target Milestone|--- |6.4
Known to fail| |6.3.1, 7.0.1
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed. With GCC 5 and earlier we expanded from
<bb 2>:
_3 = a_2(D)->low;
_5 = b_4(D)->low;
_6 = _3 + _5;
_8 = a_2(D)->hi;
_9 = b_4(D)->hi;
_10 = _8 + _9;
_11 = _3 > _6;
_12 = (long unsigned int) _11;
_13 = _10 + _12;
MEM[(struct pair *)&D.2360] = _6;
MEM[(struct pair *)&D.2360 + 8B] = _13;
return D.2360;
while with GCC 6+ we now have
<bb 2>:
_3 = a_2(D)->low;
_5 = b_4(D)->low;
_15 = ADD_OVERFLOW (_3, _5);
_6 = REALPART_EXPR <_15>;
_16 = IMAGPART_EXPR <_15>;
_7 = a_2(D)->hi;
_8 = b_4(D)->hi;
_9 = _7 + _8;
_10 = _16 != 0;
_11 = (long unsigned int) _10;
_12 = _9 + _11;
MEM[(struct pair *)&D.2306] = _6;
MEM[(struct pair *)&D.2306 + 8B] = _12;
return D.2306;
which somehow ends up in a jump for the _16 != 0 test.