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.