https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70887
Markus Trippelsdorf <trippels at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|WAITING |NEW Component|c++ |middle-end Summary|internal compiler error in |[5 Regression] internal |trunc_int_for_mode, at |compiler error in |explow.c:78 |trunc_int_for_mode, at | |explow.c:78 --- Comment #4 from Markus Trippelsdorf <trippels at gcc dot gnu.org> --- trippels@gcc75 ~ % cat main.ii typedef long long __m128i __attribute__((__vector_size__(16))); enum RangeID { RANGE_2 }; template <RangeID> struct C { static constexpr int value = 10; }; __m128i _mm_set1_epi32(int __A) { int __q0 = __A; return __m128i{__q0}; } __inline __m128i _mm_bsrli_si128(__m128i __A, int __N) { return __builtin_ia32_psrldqi128(__A, __N * 8); } __m128i _mm_bslli_si128(__m128i __A) { return __builtin_ia32_pslldqi128(__A, 8); } __m128i _mm_or_si128(__m128i __A, __m128i __B) { return __A | __B; } template <typename RangeID, template <RangeID> class Range, RangeID... rangeIds> struct A { template <int, RangeID...> struct B; template <int nPrevValues, RangeID rangeId, RangeID... restRangeIds> struct B<nPrevValues, rangeId, restRangeIds...> { static constexpr int nValues = Range<rangeId>::value; static __m128i generate() { __attribute__((__vector_size__( 2 * sizeof(long)))) long long __trans_tmp_1 = generate(), prevRanges = _mm_bslli_si128(__trans_tmp_1), newRange = _mm_bsrli_si128( _mm_set1_epi32(nValues), 12); return _mm_or_si128(prevRanges, newRange); } }; A() { B<0, rangeIds...>::generate(); } }; main() { using RI = A<RangeID, C, RANGE_2>; RI ri; } trippels@gcc75 ~ % g++ -std=c++11 -O2 main.ii main.ii: In static member function ‘static __m128i A<RangeID, Range, rangeIds>::B<nPrevValues, rangeId, restRangeIds ...>::generate() [with int nPrevValues = 0; RangeID rangeId = (RangeID)0u; RangeID ...restRangeIds = {}; RangeID = RangeID; Range = C; RangeID ...rangeIds = {(RangeID)0u}; __m128i = __vector(2) long long int]’: main.ii:29:5: internal compiler error: in trunc_int_for_mode, at explow.c:78