Skip to content

Commit 94d5c54

Browse files
authored
[clang][bytecode] Don't update temporary in InitGlobalTemp* (#158022)
We can save ourselves the conversion to an APValue here since we will do that later in updateGlobalTemporaries() anyway.
1 parent 71f7f8a commit 94d5c54

File tree

2 files changed

+16
-30
lines changed

2 files changed

+16
-30
lines changed

clang/lib/AST/ByteCode/EvalEmitter.cpp

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -331,18 +331,17 @@ bool EvalEmitter::emitDestroy(uint32_t I, const SourceInfo &Info) {
331331
/// This is what we do here.
332332
void EvalEmitter::updateGlobalTemporaries() {
333333
for (const auto &[E, Temp] : S.SeenGlobalTemporaries) {
334-
if (UnsignedOrNone GlobalIndex = P.getGlobal(E)) {
335-
const Pointer &Ptr = P.getPtrGlobal(*GlobalIndex);
336-
APValue *Cached = Temp->getOrCreateValue(true);
337-
338-
if (OptPrimType T = Ctx.classify(E->getType())) {
339-
TYPE_SWITCH(
340-
*T, { *Cached = Ptr.deref<T>().toAPValue(Ctx.getASTContext()); });
341-
} else {
342-
if (std::optional<APValue> APV =
343-
Ptr.toRValue(Ctx, Temp->getTemporaryExpr()->getType()))
344-
*Cached = *APV;
345-
}
334+
UnsignedOrNone GlobalIndex = P.getGlobal(E);
335+
assert(GlobalIndex);
336+
const Pointer &Ptr = P.getPtrGlobal(*GlobalIndex);
337+
APValue *Cached = Temp->getOrCreateValue(true);
338+
if (OptPrimType T = Ctx.classify(E->getType())) {
339+
TYPE_SWITCH(*T,
340+
{ *Cached = Ptr.deref<T>().toAPValue(Ctx.getASTContext()); });
341+
} else {
342+
if (std::optional<APValue> APV =
343+
Ptr.toRValue(Ctx, Temp->getTemporaryExpr()->getType()))
344+
*Cached = *APV;
346345
}
347346
}
348347
S.SeenGlobalTemporaries.clear();

clang/lib/AST/ByteCode/Interp.h

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1527,15 +1527,10 @@ bool InitGlobal(InterpState &S, CodePtr OpPC, uint32_t I) {
15271527
template <PrimType Name, class T = typename PrimConv<Name>::T>
15281528
bool InitGlobalTemp(InterpState &S, CodePtr OpPC, uint32_t I,
15291529
const LifetimeExtendedTemporaryDecl *Temp) {
1530-
const Pointer &Ptr = S.P.getGlobal(I);
1531-
1532-
const T Value = S.Stk.peek<T>();
1533-
APValue APV = Value.toAPValue(S.getASTContext());
1534-
APValue *Cached = Temp->getOrCreateValue(true);
1535-
*Cached = APV;
1530+
assert(Temp);
15361531

1532+
const Pointer &Ptr = S.P.getGlobal(I);
15371533
assert(Ptr.getDeclDesc()->asExpr());
1538-
15391534
S.SeenGlobalTemporaries.push_back(
15401535
std::make_pair(Ptr.getDeclDesc()->asExpr(), Temp));
15411536

@@ -1550,19 +1545,11 @@ bool InitGlobalTemp(InterpState &S, CodePtr OpPC, uint32_t I,
15501545
inline bool InitGlobalTempComp(InterpState &S, CodePtr OpPC,
15511546
const LifetimeExtendedTemporaryDecl *Temp) {
15521547
assert(Temp);
1553-
const Pointer &P = S.Stk.peek<Pointer>();
1554-
APValue *Cached = Temp->getOrCreateValue(true);
15551548

1549+
const Pointer &Ptr = S.Stk.peek<Pointer>();
15561550
S.SeenGlobalTemporaries.push_back(
1557-
std::make_pair(P.getDeclDesc()->asExpr(), Temp));
1558-
1559-
if (std::optional<APValue> APV =
1560-
P.toRValue(S.getASTContext(), Temp->getTemporaryExpr()->getType())) {
1561-
*Cached = *APV;
1562-
return true;
1563-
}
1564-
1565-
return false;
1551+
std::make_pair(Ptr.getDeclDesc()->asExpr(), Temp));
1552+
return true;
15661553
}
15671554

15681555
template <PrimType Name, class T = typename PrimConv<Name>::T>

0 commit comments

Comments
 (0)