[clang] b1f2e19 - [clang][Interp][NFC] Use ArrayElem{, Pop} ops more often
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 7 08:47:16 PST 2024
Author: Timm Bäder
Date: 2024-03-07T17:47:01+01:00
New Revision: b1f2e19dc27d339cbeb3373066e73a4c91d133dd
URL: https://github.com/llvm/llvm-project/commit/b1f2e19dc27d339cbeb3373066e73a4c91d133dd
DIFF: https://github.com/llvm/llvm-project/commit/b1f2e19dc27d339cbeb3373066e73a4c91d133dd.diff
LOG: [clang][Interp][NFC] Use ArrayElem{,Pop} ops more often
Instead of the longer ArrayElemPtr + Load.
Added:
Modified:
clang/lib/AST/Interp/ByteCodeExprGen.cpp
clang/lib/AST/Interp/Interp.h
clang/lib/AST/Interp/Opcodes.td
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index 8872579e12dc82..712218f5de2e42 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -314,11 +314,7 @@ bool ByteCodeExprGen<Emitter>::VisitCastExpr(const CastExpr *CE) {
for (unsigned I = 0; I != 2; ++I) {
if (!this->emitGetLocal(PT_Ptr, *SubExprOffset, CE))
return false;
- if (!this->emitConstUint8(I, CE))
- return false;
- if (!this->emitArrayElemPtrPopUint8(CE))
- return false;
- if (!this->emitLoadPop(SourceElemT, CE))
+ if (!this->emitArrayElemPop(SourceElemT, I, CE))
return false;
// Do the cast.
@@ -729,11 +725,8 @@ bool ByteCodeExprGen<Emitter>::VisitComplexBinOp(const BinaryOperator *E) {
if (IsComplex) {
if (!this->emitGetLocal(PT_Ptr, Offset, E))
return false;
- if (!this->emitConstUint8(ElemIndex, E))
- return false;
- if (!this->emitArrayElemPtrPopUint8(E))
- return false;
- return this->emitLoadPop(classifyComplexElementType(E->getType()), E);
+ return this->emitArrayElemPop(classifyComplexElementType(E->getType()),
+ ElemIndex, E);
}
if (ElemIndex == 0)
return this->emitGetLocal(classifyPrim(E->getType()), Offset, E);
@@ -3127,16 +3120,16 @@ bool ByteCodeExprGen<Emitter>::VisitUnaryOperator(const UnaryOperator *E) {
if (!this->visit(SubExpr))
return false;
- if (!this->emitConstUint8(1, E))
- return false;
- if (!this->emitArrayElemPtrPopUint8(E))
- return false;
+
+ if (SubExpr->isLValue()) {
+ if (!this->emitConstUint8(1, E))
+ return false;
+ return this->emitArrayElemPtrPopUint8(E);
+ }
// Since our _Complex implementation does not map to a primitive type,
// we sometimes have to do the lvalue-to-rvalue conversion here manually.
- if (!SubExpr->isLValue())
- return this->emitLoadPop(classifyPrim(E->getType()), E);
- return true;
+ return this->emitArrayElemPop(classifyPrim(E->getType()), 1, E);
}
case UO_Extension:
return this->delegate(SubExpr);
@@ -3347,17 +3340,15 @@ bool ByteCodeExprGen<Emitter>::emitComplexReal(const Expr *SubExpr) {
if (!this->visit(SubExpr))
return false;
- if (!this->emitConstUint8(0, SubExpr))
- return false;
- if (!this->emitArrayElemPtrPopUint8(SubExpr))
- return false;
+ if (SubExpr->isLValue()) {
+ if (!this->emitConstUint8(0, SubExpr))
+ return false;
+ return this->emitArrayElemPtrPopUint8(SubExpr);
+ }
- // Since our _Complex implementation does not map to a primitive type,
- // we sometimes have to do the lvalue-to-rvalue conversion here manually.
- if (!SubExpr->isLValue())
- return this->emitLoadPop(classifyComplexElementType(SubExpr->getType()),
- SubExpr);
- return true;
+ // Rvalue, load the actual element.
+ return this->emitArrayElemPop(classifyComplexElementType(SubExpr->getType()),
+ 0, SubExpr);
}
template <class Emitter>
@@ -3366,11 +3357,7 @@ bool ByteCodeExprGen<Emitter>::emitComplexBoolCast(const Expr *E) {
PrimType ElemT = classifyComplexElementType(E->getType());
// We emit the expression (__real(E) != 0 || __imag(E) != 0)
// for us, that means (bool)E[0] || (bool)E[1]
- if (!this->emitConstUint8(0, E))
- return false;
- if (!this->emitArrayElemPtrUint8(E))
- return false;
- if (!this->emitLoadPop(ElemT, E))
+ if (!this->emitArrayElem(ElemT, 0, E))
return false;
if (ElemT == PT_Float) {
if (!this->emitCastFloatingIntegral(PT_Bool, E))
@@ -3385,11 +3372,7 @@ bool ByteCodeExprGen<Emitter>::emitComplexBoolCast(const Expr *E) {
if (!this->jumpTrue(LabelTrue))
return false;
- if (!this->emitConstUint8(1, E))
- return false;
- if (!this->emitArrayElemPtrPopUint8(E))
- return false;
- if (!this->emitLoadPop(ElemT, E))
+ if (!this->emitArrayElemPop(ElemT, 1, E))
return false;
if (ElemT == PT_Float) {
if (!this->emitCastFloatingIntegral(PT_Bool, E))
diff --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h
index 43cbc2ff292c09..bb220657c2dadc 100644
--- a/clang/lib/AST/Interp/Interp.h
+++ b/clang/lib/AST/Interp/Interp.h
@@ -1959,10 +1959,24 @@ inline bool ArrayElemPtrPop(InterpState &S, CodePtr OpPC) {
return NarrowPtr(S, OpPC);
}
+template <PrimType Name, class T = typename PrimConv<Name>::T>
+inline bool ArrayElem(InterpState &S, CodePtr OpPC, uint32_t Index) {
+ const Pointer &Ptr = S.Stk.peek<Pointer>();
+
+ if (!CheckLoad(S, OpPC, Ptr))
+ return false;
+
+ S.Stk.push<T>(Ptr.atIndex(Index).deref<T>());
+ return true;
+}
+
template <PrimType Name, class T = typename PrimConv<Name>::T>
inline bool ArrayElemPop(InterpState &S, CodePtr OpPC, uint32_t Index) {
const Pointer &Ptr = S.Stk.pop<Pointer>();
+ if (!CheckLoad(S, OpPC, Ptr))
+ return false;
+
S.Stk.push<T>(Ptr.atIndex(Index).deref<T>());
return true;
}
diff --git a/clang/lib/AST/Interp/Opcodes.td b/clang/lib/AST/Interp/Opcodes.td
index ffc54646f0279e..9b99aa0ccb558a 100644
--- a/clang/lib/AST/Interp/Opcodes.td
+++ b/clang/lib/AST/Interp/Opcodes.td
@@ -368,6 +368,14 @@ def ArrayElemPop : Opcode {
let HasGroup = 1;
}
+def ArrayElem : Opcode {
+ let Args = [ArgUint32];
+ let Types = [AllTypeClass];
+ let HasGroup = 1;
+}
+
+
+
//===----------------------------------------------------------------------===//
// Direct field accessors
//===----------------------------------------------------------------------===//
More information about the cfe-commits
mailing list