Skip to content

Commit b091f2a

Browse files
AlexGutenievStephanTLavavejCaseyCarter
authored
Avoid calling size() in valarray loops (#3968)
... to ease auto-vectorization. --------- Co-authored-by: Stephan T. Lavavej <[email protected]> Co-authored-by: Casey Carter <[email protected]>
1 parent 40e1eac commit b091f2a

File tree

1 file changed

+37
-40
lines changed

1 file changed

+37
-40
lines changed

stl/inc/valarray

Lines changed: 37 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ public:
166166
}
167167

168168
valarray& operator=(const _Ty& _Val) {
169-
const size_t _Size = size();
169+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
170170
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
171171
_Myptr[_Idx] = _Val;
172172
}
@@ -192,7 +192,7 @@ public:
192192
valarray& operator=(const indirect_array<_Ty>& _Indarr); // defined below
193193

194194
_NODISCARD valarray operator+() const {
195-
const size_t _Size = size();
195+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
196196
valarray<_Ty> _Ans(_Size);
197197
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
198198
_Ans[_Idx] = +_Myptr[_Idx];
@@ -201,7 +201,7 @@ public:
201201
}
202202

203203
_NODISCARD valarray operator-() const {
204-
const size_t _Size = size();
204+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
205205
valarray<_Ty> _Ans(_Size);
206206
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
207207
_Ans[_Idx] = -_Myptr[_Idx];
@@ -210,7 +210,7 @@ public:
210210
}
211211

212212
_NODISCARD valarray operator~() const {
213-
const size_t _Size = size();
213+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
214214
valarray<_Ty> _Ans(_Size);
215215
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
216216
_Ans[_Idx] = ~_Myptr[_Idx];
@@ -219,7 +219,7 @@ public:
219219
}
220220

221221
_NODISCARD _Boolarray operator!() const {
222-
const size_t _Size = size();
222+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
223223
valarray<bool> _Ans(_Size);
224224
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
225225
_Ans[_Idx] = !_Myptr[_Idx];
@@ -228,159 +228,159 @@ public:
228228
}
229229

230230
valarray& operator*=(const _Ty& _Right) {
231-
const size_t _Size = size();
231+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
232232
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
233233
_Myptr[_Idx] *= _Right;
234234
}
235235
return *this;
236236
}
237237

238238
valarray& operator/=(const _Ty& _Right) {
239-
const size_t _Size = size();
239+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
240240
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
241241
_Myptr[_Idx] /= _Right;
242242
}
243243
return *this;
244244
}
245245

246246
valarray& operator%=(const _Ty& _Right) {
247-
const size_t _Size = size();
247+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
248248
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
249249
_Myptr[_Idx] %= _Right;
250250
}
251251
return *this;
252252
}
253253

254254
valarray& operator+=(const _Ty& _Right) {
255-
const size_t _Size = size();
255+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
256256
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
257257
_Myptr[_Idx] += _Right;
258258
}
259259
return *this;
260260
}
261261

262262
valarray& operator-=(const _Ty& _Right) {
263-
const size_t _Size = size();
263+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
264264
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
265265
_Myptr[_Idx] -= _Right;
266266
}
267267
return *this;
268268
}
269269

270270
valarray& operator^=(const _Ty& _Right) {
271-
const size_t _Size = size();
271+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
272272
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
273273
_Myptr[_Idx] ^= _Right;
274274
}
275275
return *this;
276276
}
277277

278278
valarray& operator&=(const _Ty& _Right) {
279-
const size_t _Size = size();
279+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
280280
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
281281
_Myptr[_Idx] &= _Right;
282282
}
283283
return *this;
284284
}
285285

286286
valarray& operator|=(const _Ty& _Right) {
287-
const size_t _Size = size();
287+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
288288
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
289289
_Myptr[_Idx] |= _Right;
290290
}
291291
return *this;
292292
}
293293

294294
valarray& operator<<=(const _Ty& _Right) {
295-
const size_t _Size = size();
295+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
296296
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
297297
_Myptr[_Idx] <<= _Right;
298298
}
299299
return *this;
300300
}
301301

302302
valarray& operator>>=(const _Ty& _Right) {
303-
const size_t _Size = size();
303+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
304304
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
305305
_Myptr[_Idx] >>= _Right;
306306
}
307307
return *this;
308308
}
309309

310310
valarray& operator*=(const valarray& _Right) {
311-
const size_t _Size = size();
311+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
312312
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
313313
_Myptr[_Idx] *= _Right[_Idx];
314314
}
315315
return *this;
316316
}
317317

318318
valarray& operator/=(const valarray& _Right) {
319-
const size_t _Size = size();
319+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
320320
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
321321
_Myptr[_Idx] /= _Right[_Idx];
322322
}
323323
return *this;
324324
}
325325

326326
valarray& operator%=(const valarray& _Right) {
327-
const size_t _Size = size();
327+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
328328
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
329329
_Myptr[_Idx] %= _Right[_Idx];
330330
}
331331
return *this;
332332
}
333333

334334
valarray& operator+=(const valarray& _Right) {
335-
const size_t _Size = size();
335+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
336336
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
337337
_Myptr[_Idx] += _Right[_Idx];
338338
}
339339
return *this;
340340
}
341341

342342
valarray& operator-=(const valarray& _Right) {
343-
const size_t _Size = size();
343+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
344344
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
345345
_Myptr[_Idx] -= _Right[_Idx];
346346
}
347347
return *this;
348348
}
349349

350350
valarray& operator^=(const valarray& _Right) {
351-
const size_t _Size = size();
351+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
352352
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
353353
_Myptr[_Idx] ^= _Right[_Idx];
354354
}
355355
return *this;
356356
}
357357

358358
valarray& operator|=(const valarray& _Right) {
359-
const size_t _Size = size();
359+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
360360
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
361361
_Myptr[_Idx] |= _Right[_Idx];
362362
}
363363
return *this;
364364
}
365365

366366
valarray& operator&=(const valarray& _Right) {
367-
const size_t _Size = size();
367+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
368368
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
369369
_Myptr[_Idx] &= _Right[_Idx];
370370
}
371371
return *this;
372372
}
373373

374374
valarray& operator<<=(const valarray& _Right) {
375-
const size_t _Size = size();
375+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
376376
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
377377
_Myptr[_Idx] <<= _Right[_Idx];
378378
}
379379
return *this;
380380
}
381381

382382
valarray& operator>>=(const valarray& _Right) {
383-
const size_t _Size = size();
383+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
384384
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
385385
_Myptr[_Idx] >>= _Right[_Idx];
386386
}
@@ -424,7 +424,7 @@ public:
424424
_NODISCARD indirect_array<_Ty> operator[](const _Sizarray& _Indarr); // defined below
425425

426426
_NODISCARD _Ty sum() const {
427-
const size_t _Size = size();
427+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
428428
_Ty _Sum = _Myptr[0];
429429
for (size_t _Idx = 1; _Idx < _Size; ++_Idx) {
430430
_Sum += _Myptr[_Idx];
@@ -434,7 +434,7 @@ public:
434434
}
435435

436436
_NODISCARD _Ty(min)() const {
437-
const size_t _Size = size();
437+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
438438
_Ty _Min = _Myptr[0];
439439
for (size_t _Idx = 1; _Idx < _Size; ++_Idx) {
440440
if (_Myptr[_Idx] < _Min) {
@@ -446,7 +446,7 @@ public:
446446
}
447447

448448
_NODISCARD _Ty(max)() const {
449-
const size_t _Size = size();
449+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
450450
_Ty _Max = _Myptr[0];
451451
for (size_t _Idx = 1; _Idx < _Size; ++_Idx) {
452452
if (_Max < _Myptr[_Idx]) {
@@ -458,7 +458,7 @@ public:
458458
}
459459

460460
_NODISCARD valarray shift(int _Count) const {
461-
const size_t _Size = size();
461+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
462462
valarray<_Ty> _Ans(_Size);
463463
size_t _Min = 0;
464464
size_t _Max = _Size;
@@ -480,7 +480,7 @@ public:
480480
}
481481

482482
_NODISCARD valarray cshift(int _Count) const {
483-
const size_t _Size = size();
483+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
484484
if (_Size != 0) {
485485
if (_Count < 0) { // right shift
486486
if (_Size < size_t{0} - _Count) {
@@ -502,7 +502,7 @@ public:
502502
}
503503

504504
_NODISCARD valarray apply(_Ty _Func(_Ty)) const {
505-
const size_t _Size = size();
505+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
506506
valarray<_Ty> _Ans(_Size);
507507
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
508508
_Ans[_Idx] = _Func(_Myptr[_Idx]);
@@ -512,7 +512,7 @@ public:
512512

513513
_NODISCARD valarray apply(_Ty _Func(const _Ty&)) const {
514514
// return valarray transformed by _Func, nonmutable argument
515-
const size_t _Size = size();
515+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
516516
valarray<_Ty> _Ans(_Size);
517517
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
518518
_Ans[_Idx] = _Func(_Myptr[_Idx]);
@@ -555,10 +555,7 @@ private:
555555

556556
void _Tidy_deallocate() noexcept {
557557
if (_Myptr) { // destroy elements
558-
for (size_t _Idx = 0; _Idx < _Mysize; ++_Idx) {
559-
_Destroy_in_place(_Myptr[_Idx]);
560-
}
561-
558+
_Destroy_range(_Myptr, _Myptr + _Mysize);
562559
#ifdef __cpp_aligned_new
563560
constexpr bool _Extended_alignment = alignof(_Ty) > __STDCPP_DEFAULT_NEW_ALIGNMENT__;
564561
if constexpr (_Extended_alignment) {
@@ -574,7 +571,7 @@ private:
574571
}
575572

576573
void _Assign(size_t _Newsize, const _Ty* _Ptr) {
577-
const size_t _Size = size();
574+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
578575
if (_Size == _Newsize) {
579576
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
580577
_Myptr[_Idx] = _Ptr[_Idx];
@@ -1988,7 +1985,7 @@ valarray<_Ty>& valarray<_Ty>::operator=(const gslice_array<_Ty>& _Gslicearr) {
19881985
_Tidy_deallocate();
19891986
_Grow(_Gslicearr._Totlen());
19901987
_Sizarray _Indexarray(size_t{0}, _Gslicearr._Nslice());
1991-
const size_t _Size = size();
1988+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
19921989
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
19931990
_Myptr[_Idx] = _Gslicearr._Data(_Gslicearr._Off(_Indexarray));
19941991
}
@@ -2011,7 +2008,7 @@ valarray<_Ty>& valarray<_Ty>::operator=(const mask_array<_Ty>& _Maskarr) {
20112008
_Grow(_Maskarr._Totlen());
20122009
size_t _Count = 0;
20132010

2014-
const size_t _Size = size();
2011+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
20152012
for (size_t _Idx = 0; _Idx < _Size; ++_Count) {
20162013
if (_Maskarr._Mask(_Count)) {
20172014
_Myptr[_Idx++] = _Maskarr._Data(_Count);
@@ -2035,7 +2032,7 @@ template <class _Ty>
20352032
valarray<_Ty>& valarray<_Ty>::operator=(const indirect_array<_Ty>& _Indarr) {
20362033
_Tidy_deallocate();
20372034
_Grow(_Indarr._Totlen());
2038-
const size_t _Size = size();
2035+
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
20392036
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
20402037
_Myptr[_Idx] = _Indarr._Data(_Indarr._Indir(_Idx));
20412038
}

0 commit comments

Comments
 (0)