Skip to content

Commit 4a44a85

Browse files
authored
[clang][bytecode] Add Pointer::initializeAllElements() (#151151)
To initialize all elements of a primitive array at once. This saves us from creating the InitMap just to destroy it again after all elements have been initialized.
1 parent 59c3fe6 commit 4a44a85

File tree

4 files changed

+26
-20
lines changed

4 files changed

+26
-20
lines changed

clang/lib/AST/ByteCode/Interp.h

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -481,13 +481,11 @@ inline bool Mulc(InterpState &S, CodePtr OpPC) {
481481
Floating RA = S.allocFloat(A.getSemantics());
482482
RA.copy(ResR);
483483
Result.elem<Floating>(0) = RA; // Floating(ResR);
484-
Result.atIndex(0).initialize();
485484

486485
Floating RI = S.allocFloat(A.getSemantics());
487486
RI.copy(ResI);
488487
Result.elem<Floating>(1) = RI; // Floating(ResI);
489-
Result.atIndex(1).initialize();
490-
Result.initialize();
488+
Result.initializeAllElements();
491489
} else {
492490
// Integer element type.
493491
const T &LHSR = LHS.elem<T>(0);
@@ -505,7 +503,6 @@ inline bool Mulc(InterpState &S, CodePtr OpPC) {
505503
return false;
506504
if (T::sub(A, B, Bits, &Result.elem<T>(0)))
507505
return false;
508-
Result.atIndex(0).initialize();
509506

510507
// imag(Result) = (real(LHS) * imag(RHS)) + (imag(LHS) * real(RHS))
511508
if (T::mul(LHSR, RHSI, Bits, &A))
@@ -514,8 +511,8 @@ inline bool Mulc(InterpState &S, CodePtr OpPC) {
514511
return false;
515512
if (T::add(A, B, Bits, &Result.elem<T>(1)))
516513
return false;
517-
Result.atIndex(1).initialize();
518514
Result.initialize();
515+
Result.initializeAllElements();
519516
}
520517

521518
return true;
@@ -541,14 +538,12 @@ inline bool Divc(InterpState &S, CodePtr OpPC) {
541538
Floating RA = S.allocFloat(A.getSemantics());
542539
RA.copy(ResR);
543540
Result.elem<Floating>(0) = RA; // Floating(ResR);
544-
Result.atIndex(0).initialize();
545541

546542
Floating RI = S.allocFloat(A.getSemantics());
547543
RI.copy(ResI);
548544
Result.elem<Floating>(1) = RI; // Floating(ResI);
549-
Result.atIndex(1).initialize();
550545

551-
Result.initialize();
546+
Result.initializeAllElements();
552547
} else {
553548
// Integer element type.
554549
const T &LHSR = LHS.elem<T>(0);
@@ -590,7 +585,6 @@ inline bool Divc(InterpState &S, CodePtr OpPC) {
590585
return false;
591586
if (T::div(ResultR, Den, Bits, &ResultR))
592587
return false;
593-
Result.atIndex(0).initialize();
594588

595589
// imag(Result) = ((imag(LHS) * real(RHS)) - (real(LHS) * imag(RHS))) / Den
596590
if (T::mul(LHSI, RHSR, Bits, &A) || T::mul(LHSR, RHSI, Bits, &B))
@@ -599,8 +593,7 @@ inline bool Divc(InterpState &S, CodePtr OpPC) {
599593
return false;
600594
if (T::div(ResultI, Den, Bits, &ResultI))
601595
return false;
602-
Result.atIndex(1).initialize();
603-
Result.initialize();
596+
Result.initializeAllElements();
604597
}
605598

606599
return true;

clang/lib/AST/ByteCode/InterpBuiltin.cpp

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,10 +1099,8 @@ static bool interp__builtin_complex(InterpState &S, CodePtr OpPC,
10991099
Pointer &Result = S.Stk.peek<Pointer>();
11001100

11011101
Result.elem<Floating>(0) = Arg1;
1102-
Result.atIndex(0).initialize();
11031102
Result.elem<Floating>(1) = Arg2;
1104-
Result.atIndex(1).initialize();
1105-
Result.initialize();
1103+
Result.initializeAllElements();
11061104

11071105
return true;
11081106
}
@@ -1728,9 +1726,9 @@ static bool interp__builtin_elementwise_popcount(InterpState &S, CodePtr OpPC,
17281726
Dst.elem<T>(I) =
17291727
T::from(Arg.elem<T>(I).toAPSInt().reverseBits().getZExtValue());
17301728
}
1731-
Dst.atIndex(I).initialize();
17321729
});
17331730
}
1731+
Dst.initializeAllElements();
17341732

17351733
return true;
17361734
}
@@ -2314,12 +2312,10 @@ static bool interp__builtin_elementwise_sat(InterpState &S, CodePtr OpPC,
23142312
llvm_unreachable("Wrong builtin ID");
23152313
}
23162314

2317-
INT_TYPE_SWITCH_NO_BOOL(ElemT, {
2318-
const Pointer &E = Dst.atIndex(I);
2319-
E.deref<T>() = static_cast<T>(Result);
2320-
E.initialize();
2321-
});
2315+
INT_TYPE_SWITCH_NO_BOOL(ElemT,
2316+
{ Dst.elem<T>(I) = static_cast<T>(Result); });
23222317
}
2318+
Dst.initializeAllElements();
23232319

23242320
return true;
23252321
}

clang/lib/AST/ByteCode/Pointer.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,19 @@ void Pointer::initialize() const {
495495
getInlineDesc()->IsInitialized = true;
496496
}
497497

498+
void Pointer::initializeAllElements() const {
499+
assert(getFieldDesc()->isPrimitiveArray());
500+
assert(isArrayRoot());
501+
502+
InitMapPtr &IM = getInitMap();
503+
if (!IM) {
504+
IM = std::make_pair(true, nullptr);
505+
} else {
506+
IM->first = true;
507+
IM->second.reset();
508+
}
509+
}
510+
498511
void Pointer::activate() const {
499512
// Field has its bit in an inline descriptor.
500513
assert(PointeeStorage.BS.Base != 0 &&

clang/lib/AST/ByteCode/Pointer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -725,6 +725,10 @@ class Pointer {
725725

726726
/// Initializes a field.
727727
void initialize() const;
728+
/// Initialize all elements of a primitive array at once. This can be
729+
/// used in situations where we *know* we have initialized *all* elements
730+
/// of a primtive array.
731+
void initializeAllElements() const;
728732
/// Activats a field.
729733
void activate() const;
730734
/// Deactivates an entire strurcutre.

0 commit comments

Comments
 (0)