comparison gcc/testsuite/g++.target/i386/pr88785.C @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
comparison
equal deleted inserted replaced
131:84e7813d76e9 145:1830386684a0
1 // PR target/88785
2 // { dg-do compile }
3 // { dg-options "-O2 -g -std=c++17 -mavx512vl -mavx512dq" }
4
5 namespace a {
6 template <class> class b;
7 template <class> class d;
8 }
9 template <int f> struct g { static constexpr int e = f; };
10 template <typename> struct aa;
11 template <typename...> struct o;
12 template <typename h, typename ab> struct o<h, ab> : aa<h>::ac {};
13 template <typename...> struct j;
14 template <typename h, typename ab> struct j<h, ab> : aa<ab>::ac {};
15 template <typename... k> constexpr bool l = o<k...>::e;
16 template <typename, typename> struct r : g<false> {};
17 template <typename m> struct r<m, m> : g<true> {};
18 template <typename ad> struct aa { typedef ad ac; };
19 template <bool, typename ad, typename> using ae = ad;
20 template <typename...> using af = void;
21 typedef float ag __attribute__((__vector_size__(16)));
22 ag ah;
23 ag ai(__attribute__((__vector_size__(2 * sizeof(long long)))) long long z) {
24 ah = ag{};
25 __attribute__((__vector_size__(4 * sizeof(float)))) float aj = ah;
26 return __builtin_ia32_cvtqq2ps128_mask(z, aj, 1);
27 }
28 namespace a {
29 int ak;
30 int al;
31 template <long> int am;
32 template <class> struct an;
33 template <class> struct ao;
34 template <class m> using ap = typename ao<m>::ac;
35 template <class, unsigned long, class = af<>> struct aq;
36 template <class m> using ar = aq<m, sizeof(m)>;
37 template <class as, class at> as au(at);
38 template <class> struct av;
39 template <class m> using aw = typename av<m>::ac;
40 template <class m, int ax> struct ay {
41 static constexpr long az = ax * sizeof(int);
42 using ac [[gnu::__vector_size__(az)]] = m;
43 };
44 template <class m, long ba> using bb = typename ay<m, ba>::ac;
45 template <class m> struct p {
46 using bc = decltype(m()[0]);
47 static constexpr int bd = sizeof(bc);
48 };
49 template <class as, class m, class = p<m>> as be(m);
50 template <class as, class... at> as bf(at... z) { return be<as>(z...); }
51 template <class m, unsigned long ax, class bg = aw<m>> bg bh(aq<m, ax>) {
52 return bg();
53 }
54 template <> struct av<float> {
55 using ac [[gnu::__vector_size__(16)]] = float;
56 };
57 template <class> struct av {
58 using ac [[gnu::__vector_size__(16)]] = long long;
59 };
60 template <unsigned long bi> struct aq<bool, bi> {};
61 template <class m, unsigned long bi, class bj = bb<m, bi>,
62 bool = l<r<bb<m, bi>, aw<m>>, r<bj, m>>>
63 struct bk;
64 template <class m, unsigned long bi, class bj> struct bk<m, bi, bj, true> {
65 bj bl;
66 bk(bb<m, bi> z) : bl(z) {}
67 };
68 template <class m, unsigned long bi, class bj> struct bk<m, bi, bj, false> {};
69 template <class m, unsigned long bi> struct aq<m, bi> : bk<m, bi> {
70 using bm = bb<m, bi>;
71 static constexpr long bd = bi;
72 aq();
73 template <class bn> aq(bn z) : bk<m, bi>(z) {}
74 m operator[](long);
75 };
76 template <class> constexpr long bo = g<0>::e;
77 template <class m> struct ao { using ac = typename an<m>::br; };
78 template <class bp, class m> class bq {
79 using bu = m;
80 bp bs;
81 m bt;
82
83 public:
84 template <class bn, class bv> void q(bn z, bv bw) {
85 auto s = bx(bt), by = bx(bs);
86 ap<bu>::bz(s, z, bw, by);
87 }
88 };
89 class ca {
90 public:
91 template <class bn, class bv> void cb(bn, bv);
92 };
93 template <class m> ca cc(typename b<m>::cd, m &);
94 template <class m> bq<d<m>, b<m>> cc(typename b<m>::cd, const m &);
95 struct ce;
96 template <class t, int ax> struct cf {
97 using br = typename t::br;
98 using cg = aq<long, ax>;
99 using ch = aq<long, ax>;
100 };
101 struct ci {
102 template <class m> static constexpr long cj = sizeof(m);
103 struct ck : j<int, g<sizeof(int)>> {};
104 template <class> static constexpr bool cl = ck::e;
105 using br = ce;
106 template <class m> using cn = ae<cl<m>, cf<ci, cj<m>>, int>;
107 };
108 template <class> struct an : ci::cn<long> {};
109 template <class> class d : an<int> {
110 using cm = ch;
111
112 public:
113 cm bl;
114 };
115 template <class m> auto bx(m z) { return z.bl; }
116 template <class> class b : an<int> {
117 using cm = cg;
118
119 public:
120 using cd = d<long>;
121 static long cu();
122 b();
123 template <class bn, class bv> b(bn, bv) {}
124 cm bl;
125 };
126 template <class m> auto bx(b<m> z) { return z.bl; }
127 template <class m, class co> void cq(ar<m>, co, aq<bool, ar<m>::bd>);
128 template <class as, class bu, class cp> as be(bu z) {
129 using cs = typename cp::bc;
130 constexpr long ax = cp::bd;
131 auto cr = bh(z);
132 aq<cs, ax> f;
133 using bn = typename p<as>::bc;
134 constexpr bool cy = sizeof(f), ct = sizeof(bn);
135 if (ct)
136 if (cy) {
137 ag cw = ai(cr);
138 return cw;
139 }
140 }
141 template <class as, class at> auto cv(at z) { return bf<as>(z); }
142 struct G {
143 template <class m> using ch = typename ci::cn<m>::ch;
144 template <class m, unsigned long ax, class bn, class co>
145 static void bz(aq<m, ax> z, bn *, co, ch<m> cx) {
146 using da = aq<bn, sizeof(bn)>;
147 using bu = typename da::bm;
148 using bp = aq<ae<1, bool, bn>, da::bd>;
149 auto cz = cv<bu>(z);
150 cq(da(cz), ae<0, int, co>(), au<bp>(cx));
151 }
152 };
153 struct ce : G {};
154 }
155 class D {
156 public:
157 D(...);
158 template <typename db> void operator<<(db);
159 };
160 template <class dc> dc dd;
161 struct de {
162 long cu();
163 };
164 template <typename dc> void dg() {
165 using db = long;
166 auto df = dd<a::b<long>>;
167 using a::ak;
168 using a::al;
169 constexpr long di = 1, alignment = a::bo<a::b<long>>;
170 using dh = ae<di, decltype(al), int>;
171 dh dk, am = a::am<alignment>;
172 const a::b<long> dj;
173 de u;
174 auto dm = 0 ? u.cu() : 0;
175 float dl[dm];
176 db reference;
177 a::b<long> x;
178 auto compare = [&](long) {
179 int n;
180 a::b<long>(reference, ak);
181 for (auto i = 0; 0; ++i)
182 [] {
183 auto v = 0, w = 0;
184 return D(w, v);
185 }() << n;
186 };
187 compare(0);
188 using c = a::b<long>::cd;
189 c dn;
190 a::b y = df;
191 auto v(y);
192 cc(dn, x).cb(dl, am);
193 long i;
194 cc(dn, dj).q(&dl[dc::cu()], dk);
195 ++i;
196 }
197 void test() { dg<a::b<long>>(); }