Author: Timm Baeder Date: 2026-09-20T08:20:33+02:00 New Revision: c4f702aed65d0f9af31f60849846b2bb31d8fbb0
URL: https://github.com/llvm/llvm-project/commit/c4f702aed65d0f9af31f60849846b2bb31d8fbb0 DIFF: https://github.com/llvm/llvm-project/commit/c4f702aed65d0f9af31f60849846b2bb31d8fbb0.diff LOG: [clang][bytecode] Remove unnecessary pointer type checks in CheckLoad/CheckStore (#224884) Only check the pointer type once. Added: Modified: clang/lib/AST/ByteCode/Interp.cpp clang/lib/AST/ByteCode/Pointer.h Removed: ################################################################################ diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp index dde7e54d86977..49ebcc789b7dd 100644 --- a/clang/lib/AST/ByteCode/Interp.cpp +++ b/clang/lib/AST/ByteCode/Interp.cpp @@ -729,7 +729,7 @@ bool CheckMutable(InterpState &S, CodePtr OpPC, PtrView Ptr, AccessKinds AK) { return false; } -static bool CheckVolatile(InterpState &S, CodePtr OpPC, const Pointer &Ptr, +static bool CheckVolatile(InterpState &S, CodePtr OpPC, PtrView Ptr, AccessKinds AK) { assert(Ptr.isLive()); @@ -745,7 +745,7 @@ static bool CheckVolatile(InterpState &S, CodePtr OpPC, const Pointer &Ptr, // The reason why Ptr is volatile might be further up the hierarchy. // Find that pointer. - Pointer P = Ptr; + PtrView P = Ptr; while (!P.isRoot()) { if (P.getType().isVolatileQualified()) break; @@ -960,15 +960,18 @@ bool CheckLoad(InterpState &S, CodePtr OpPC, const Pointer &Ptr, return false; if (!Ptr.isInitialized()) return diagnoseUninitialized(S, OpPC, Ptr, AK); - if (!CheckLifetime(S, OpPC, Ptr, AK)) - return false; - if (Ptr.isBlockPointer() && !CheckTemporary(S, OpPC, Ptr.block(), AK)) - return false; - if (!CheckMutable(S, OpPC, Ptr)) - return false; - if (!CheckVolatile(S, OpPC, Ptr, AK)) - return false; + if (Ptr.isBlockPointer()) { + if (!CheckLifetime(S, OpPC, Ptr.getLifetime(), Ptr.block(), AK)) + return false; + if (!CheckTemporary(S, OpPC, Ptr.block(), AK)) + return false; + + if (!CheckMutable(S, OpPC, Ptr.view(), AK)) + return false; + if (!CheckVolatile(S, OpPC, Ptr.view(), AK)) + return false; + } if (isConstexprUnknown(Ptr)) return false; @@ -1022,14 +1025,17 @@ bool CheckFinalLoad(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { if (!CheckActive(S, OpPC, Ptr, AK_Read)) return false; - if (!CheckLifetime(S, OpPC, Ptr, AK_Read)) - return false; if (!Ptr.isInitialized()) return diagnoseUninitialized(S, OpPC, Ptr, AK_Read); - if (Ptr.isBlockPointer() && !CheckTemporary(S, OpPC, Ptr.block(), AK_Read)) - return false; - if (!CheckMutable(S, OpPC, Ptr)) - return false; + + if (Ptr.isBlockPointer()) { + if (!CheckLifetime(S, OpPC, Ptr.getLifetime(), Ptr.block(), AK_Read)) + return false; + if (!CheckTemporary(S, OpPC, Ptr.block(), AK_Read)) + return false; + if (!CheckMutable(S, OpPC, Ptr.view())) + return false; + } if (Ptr.isConstexprUnknown()) return false; return true; @@ -1061,9 +1067,9 @@ bool CheckStore(InterpState &S, CodePtr OpPC, const Pointer &Ptr, return false; if (!CheckConst(S, OpPC, Ptr)) return false; - if (!CheckVolatile(S, OpPC, Ptr, AK)) + if (!CheckVolatile(S, OpPC, Ptr.view(), AK)) return false; - if (!CheckMutable(S, OpPC, Ptr, AK)) + if (!CheckMutable(S, OpPC, Ptr.view(), AK)) return false; if (isConstexprUnknown(Ptr)) return false; diff --git a/clang/lib/AST/ByteCode/Pointer.h b/clang/lib/AST/ByteCode/Pointer.h index d19374acf00c4..54e0f858b4fa0 100644 --- a/clang/lib/AST/ByteCode/Pointer.h +++ b/clang/lib/AST/ByteCode/Pointer.h @@ -49,6 +49,9 @@ struct PtrView { bool isMutable() const { return !isRoot() && getInlineDesc()->IsFieldMutable; } + bool isVolatile() const { + return isRoot() ? getDeclDesc()->IsVolatile : getInlineDesc()->IsVolatile; + } bool inUnion() const { return getInlineDesc()->InUnion; }; bool inArray() const { return getFieldDesc()->IsArray; } bool inPrimitiveArray() const { return getFieldDesc()->isPrimitiveArray(); } @@ -954,7 +957,7 @@ class Pointer { bool isVolatile() const { if (!isBlockPointer()) return false; - return isRoot() ? getDeclDesc()->IsVolatile : getInlineDesc()->IsVolatile; + return view().isVolatile(); } /// Returns the declaration ID. _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
