Mercurial > hg > CbC > CbC_gcc
comparison gcc/testsuite/g++.dg/tree-ssa/pr90078.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 // { dg-do compile } | |
2 // { dg-options "-std=c++14 -O2 -ftemplate-depth=1000000" } | |
3 | |
4 template <class T, int Dim0, int Dim1, int Dim2> struct Tensor3; | |
5 template <class A, class T, int Dim0, int Dim1, int Dim2, char i, char j, | |
6 char k> | |
7 struct Tensor3_Expr; | |
8 | |
9 template <class T, int Dim0, int Dim1, int Dim2, int Dim3> struct Tensor4; | |
10 template <class A, class T, int Dim0, int Dim1, int Dim2, int Dim3, char i, | |
11 char j, char k, char l> | |
12 struct Tensor4_Expr; | |
13 | |
14 template <char i, int Dim> struct Index | |
15 {}; | |
16 template <const int N> struct Number | |
17 { | |
18 Number(){}; | |
19 operator int() const { return N; } | |
20 }; | |
21 | |
22 template <class T, int Tensor_Dim0, int Tensor_Dim1, int Tensor_Dim2> | |
23 struct Tensor3 | |
24 { | |
25 T data[Tensor_Dim0][Tensor_Dim1][Tensor_Dim2]; | |
26 | |
27 T operator()(const int N1, const int N2, const int N3) const | |
28 { | |
29 return data[N1][N2][N3]; | |
30 } | |
31 | |
32 template <char i, char j, char k, int Dim0, int Dim1, int Dim2> | |
33 Tensor3_Expr<const Tensor3<T, Tensor_Dim0, Tensor_Dim1, Tensor_Dim2>, T, | |
34 Dim0, Dim1, Dim2, i, j, k> | |
35 operator()(const Index<i, Dim0>, const Index<j, Dim1>, | |
36 const Index<k, Dim2>) const | |
37 { | |
38 return Tensor3_Expr<const Tensor3<T, Tensor_Dim0, Tensor_Dim1, Tensor_Dim2>, | |
39 T, Dim0, Dim1, Dim2, i, j, k>(*this); | |
40 } | |
41 }; | |
42 | |
43 template <class A, class T, int Dim0, int Dim1, int Dim2, char i, char j, | |
44 char k> | |
45 struct Tensor3_Expr | |
46 { | |
47 A iter; | |
48 | |
49 Tensor3_Expr(const A &a) : iter(a) {} | |
50 T operator()(const int N1, const int N2, const int N3) const | |
51 { | |
52 return iter(N1, N2, N3); | |
53 } | |
54 }; | |
55 | |
56 template <class A, class T, int Tensor_Dim0, int Tensor_Dim1, int Tensor_Dim2, | |
57 int Dim0, int Dim1, int Dim2, char i, char j, char k> | |
58 struct Tensor3_Expr<Tensor3<A, Tensor_Dim0, Tensor_Dim1, Tensor_Dim2>, T, Dim0, | |
59 Dim1, Dim2, i, j, k> | |
60 { | |
61 Tensor3<A, Tensor_Dim0, Tensor_Dim1, Tensor_Dim2> &iter; | |
62 | |
63 Tensor3_Expr(Tensor3<A, Tensor_Dim0, Tensor_Dim1, Tensor_Dim2> &a) : iter(a) | |
64 {} | |
65 T operator()(const int N1, const int N2, const int N3) const | |
66 { | |
67 return iter(N1, N2, N3); | |
68 } | |
69 }; | |
70 | |
71 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim23, | |
72 int Dim4, int Dim5, char i, char j, char k, char l, char m> | |
73 struct Tensor3_times_Tensor3_21 | |
74 { | |
75 Tensor3_Expr<A, T, Dim0, Dim1, Dim23, i, j, k> iterA; | |
76 Tensor3_Expr<B, U, Dim23, Dim4, Dim5, k, l, m> iterB; | |
77 | |
78 template <int CurrentDim> | |
79 T eval(const int N1, const int N2, const int N3, const int N4, | |
80 const Number<CurrentDim> &) const | |
81 { | |
82 return iterA(N1, N2, CurrentDim - 1) * iterB(CurrentDim - 1, N3, N4) | |
83 + eval(N1, N2, N3, N4, Number<CurrentDim - 1>()); | |
84 } | |
85 T eval(const int N1, const int N2, const int N3, const int N4, | |
86 const Number<1> &) const | |
87 { | |
88 return iterA(N1, N2, 0) * iterB(0, N3, N4); | |
89 } | |
90 | |
91 Tensor3_times_Tensor3_21( | |
92 const Tensor3_Expr<A, T, Dim0, Dim1, Dim23, i, j, k> &a, | |
93 const Tensor3_Expr<B, U, Dim23, Dim4, Dim5, k, l, m> &b) | |
94 : iterA(a), iterB(b) | |
95 {} | |
96 T operator()(const int &N1, const int &N2, const int &N3, | |
97 const int &N4) const | |
98 { | |
99 return eval(N1, N2, N3, N4, Number<Dim23>()); | |
100 } | |
101 }; | |
102 | |
103 template <class A, class B, class T, class U, int Dim0, int Dim1, int Dim23, | |
104 int Dim4, int Dim5, char i, char j, char k, char l, char m> | |
105 Tensor4_Expr<Tensor3_times_Tensor3_21<A, B, T, U, Dim0, Dim1, Dim23, Dim4, | |
106 Dim5, i, j, k, l, m>, | |
107 T, Dim0, Dim1, Dim4, Dim5, i, j, l, m> | |
108 operator*(const Tensor3_Expr<A, T, Dim0, Dim1, Dim23, i, j, k> &a, | |
109 const Tensor3_Expr<B, U, Dim23, Dim4, Dim5, k, l, m> &b) | |
110 { | |
111 using TensorExpr = Tensor3_times_Tensor3_21<A, B, T, U, Dim0, Dim1, Dim23, | |
112 Dim4, Dim5, i, j, k, l, m>; | |
113 return Tensor4_Expr<TensorExpr, T, Dim0, Dim1, Dim4, Dim5, i, j, l, m>( | |
114 TensorExpr(a, b)); | |
115 }; | |
116 | |
117 template <class T, int Tensor_Dim0, int Tensor_Dim1, int Tensor_Dim2, | |
118 int Tensor_Dim3> | |
119 struct Tensor4 | |
120 { | |
121 T data[Tensor_Dim0][Tensor_Dim1][Tensor_Dim2][Tensor_Dim3]; | |
122 | |
123 Tensor4() {} | |
124 T &operator()(const int N1, const int N2, const int N3, const int N4) | |
125 { | |
126 return data[N1][N2][N3][N4]; | |
127 } | |
128 | |
129 template <char i, char j, char k, char l, int Dim0, int Dim1, int Dim2, | |
130 int Dim3> | |
131 Tensor4_Expr<Tensor4<T, Tensor_Dim0, Tensor_Dim1, Tensor_Dim2, Tensor_Dim3>, | |
132 T, Dim0, Dim1, Dim2, Dim3, i, j, k, l> | |
133 operator()(const Index<i, Dim0>, const Index<j, Dim1>, const Index<k, Dim2>, | |
134 const Index<l, Dim3>) | |
135 { | |
136 return Tensor4_Expr< | |
137 Tensor4<T, Tensor_Dim0, Tensor_Dim1, Tensor_Dim2, Tensor_Dim3>, T, Dim0, | |
138 Dim1, Dim2, Dim3, i, j, k, l>(*this); | |
139 }; | |
140 }; | |
141 | |
142 template <class A, class T, int Dim0, int Dim1, int Dim2, int Dim3, char i, | |
143 char j, char k, char l> | |
144 struct Tensor4_Expr | |
145 { | |
146 A iter; | |
147 | |
148 Tensor4_Expr(const A &a) : iter(a) {} | |
149 T operator()(const int N1, const int N2, const int N3, const int N4) const | |
150 { | |
151 return iter(N1, N2, N3, N4); | |
152 } | |
153 }; | |
154 | |
155 template <class A, class T, int Dim0, int Dim1, int Dim2, int Dim3, char i, | |
156 char j, char k, char l> | |
157 struct Tensor4_Expr<Tensor4<A, Dim0, Dim1, Dim2, Dim3>, T, Dim0, Dim1, Dim2, | |
158 Dim3, i, j, k, l> | |
159 { | |
160 Tensor4<A, Dim0, Dim1, Dim2, Dim3> &iter; | |
161 | |
162 Tensor4_Expr(Tensor4<A, Dim0, Dim1, Dim2, Dim3> &a) : iter(a) {} | |
163 T operator()(const int N1, const int N2, const int N3, const int N4) const | |
164 { | |
165 return iter(N1, N2, N3, N4); | |
166 } | |
167 | |
168 template <class B, class U, int Dim1_0, int Dim1_1, int Dim1_2, int Dim1_3, | |
169 char i_1, char j_1, char k_1, char l_1> | |
170 auto &operator=(const Tensor4_Expr<B, U, Dim1_0, Dim1_1, Dim1_2, Dim1_3, i_1, | |
171 j_1, k_1, l_1> &rhs) | |
172 { | |
173 for(int ii = 0; ii < Dim0; ++ii) | |
174 for(int jj = 0; jj < Dim1; ++jj) | |
175 for(int kk = 0; kk < Dim2; ++kk) | |
176 for(int ll = 0; ll < Dim3; ++ll) | |
177 { | |
178 iter(ii, jj, kk, ll) = rhs(ii, jj, kk, ll); | |
179 } | |
180 return *this; | |
181 } | |
182 }; | |
183 | |
184 int main() | |
185 { | |
186 Tensor3<float, 100, 100, 1000> t1; | |
187 Tensor3<float, 1000, 100, 100> t2; | |
188 | |
189 Index<'l', 100> l; | |
190 Index<'m', 100> m; | |
191 Index<'k', 1000> k; | |
192 Index<'n', 100> n; | |
193 Index<'o', 100> o; | |
194 | |
195 Tensor4<float, 100, 100, 100, 100> res; | |
196 res(l, m, n, o) = t1(l, m, k) * t2(k, n, o); | |
197 return 0; | |
198 } | |
199 |