https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85466
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Richard Biener from comment #5) > I see sth like > > template<typename _RealType, size_t __bits, > typename _UniformRandomNumberGenerator> > _RealType > generate_canonical(_UniformRandomNumberGenerator& __urng) > { > ... > __ret = std::nextafter(_RealType(1), _RealType(0)); > > instantiated as > > _RealType std::generate_canonical(_UniformRandomNumberGenerator&) [with > _RealType = double; long unsigned int __bits = 53; > _UniformRandomNumberGenerator = std::mersenne_twister_engine<long unsigned > int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640, 15, > 4022730752, 18, 1812433253>] (struct mersenne_twister_engine & __urng) > { > ... > const long double __r; > ^^^ > (but that's unused it seems) > ... > __ret = nextafter (1.0e+0, 0.0); > > and cmath containing > > constexpr float > nextafter(float __x, float __y) > { return __builtin_nextafterf(__x, __y); } > > constexpr long double > nextafter(long double __x, long double __y) > { return __builtin_nextafterl(__x, __y); } > > > > template<typename _Tp, typename _Up> > constexpr typename __gnu_cxx::__promote_2<_Tp, _Up>::__type > nextafter(_Tp __x, _Up __y) > { > typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; > return nextafter(__type(__x), __type(__y)); > } > > which means std::nextafter will use the long double variant? Ah, and in the same function: _3 = (long double) __tmp; _4 = _3 * 4.294967296e+9; __tmp = (double) _4; likely from const long double __r = static_cast<long double>(__urng.max()) - static_cast<long double>(__urng.min()) + 1.0L; the loop to be vectorized is <bb 32> [1.36%]: # n_315 = PHI <0(31), n_290(35)> # ivtmp_313 = PHI <10000000(31), ivtmp_289(35)> _312 = (long unsigned int) n_315; _311 = _312 * 4; _310 = _82 + _311; _309 = *_310; _308 = _309 - 5.0e-1; _307 = _308 > 0.0; _306 = (int) _307; _305 = _308 < 0.0; _304 = (int) _305; _303 = _306 - _304; _302 = (float) _303; if (_302 < 0.0) goto <bb 34>; [36.00%] else goto <bb 33>; [64.00%] <bb 33> [0.87%]: <bb 34> [1.37%]: # _301 = PHI <&D.56316(32), &D.56315(33)> D.56315 ={v} {CLOBBER}; D.56316 ={v} {CLOBBER}; _298 = *_301; _297 = _298 * 6.99999988079071044921875e-1; _296 = _297 + 1.00000001490116119384765625e-1; _295 = pretmp_336 + _311; *_295 = _296; n_290 = n_315 + 1; ivtmp_289 = ivtmp_313 - 1; if (ivtmp_289 == 0) goto <bb 36>; [1.01%] else goto <bb 35>; [98.99%] <bb 35> [1.36%]: goto <bb 32>; [100.00%] which failed to if-convert, quite possibly because of the strange clobbers. Which means the testcase is likely undefined as well.