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

Reply via email to