Author: Timm Baeder
Date: 2026-08-30T09:38:25+02:00
New Revision: 9b8cb3dc5f9847cd1039c7e6b4df2f18cbec72be

URL: 
https://github.com/llvm/llvm-project/commit/9b8cb3dc5f9847cd1039c7e6b4df2f18cbec72be
DIFF: 
https://github.com/llvm/llvm-project/commit/9b8cb3dc5f9847cd1039c7e6b4df2f18cbec72be.diff

LOG: [clang][bytecode] Divide `noteStep()` in hot and cold paths (#219760)

Move the hot success path into the header file to encourage inlining.
Also add a likeliness-hint since the steps check should _almost_ never
hit.

Added: 
    

Modified: 
    clang/lib/AST/ByteCode/InterpState.cpp
    clang/lib/AST/ByteCode/InterpState.h

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/ByteCode/InterpState.cpp 
b/clang/lib/AST/ByteCode/InterpState.cpp
index 6ac1b2610dd09..4143a39dac83f 100644
--- a/clang/lib/AST/ByteCode/InterpState.cpp
+++ b/clang/lib/AST/ByteCode/InterpState.cpp
@@ -157,14 +157,7 @@ StdAllocatorCaller 
InterpState::getStdAllocatorCaller(StringRef Name) const {
   return {};
 }
 
-bool InterpState::noteStep(CodePtr OpPC) {
-  if (InfiniteSteps)
-    return true;
-
-  --StepsLeft;
-  if (StepsLeft != 0)
-    return true;
-
+bool InterpState::diagnoseStepLimitExceeded(CodePtr OpPC) {
   FFDiag(Current->getSource(OpPC), diag::note_constexpr_step_limit_exceeded, 1)
       << getLangOpts().ConstexprStepLimit;
   Note(Current->getSource(OpPC), diag::note_constexpr_steps);

diff  --git a/clang/lib/AST/ByteCode/InterpState.h 
b/clang/lib/AST/ByteCode/InterpState.h
index 9eb94faf813ef..5977162df445c 100644
--- a/clang/lib/AST/ByteCode/InterpState.h
+++ b/clang/lib/AST/ByteCode/InterpState.h
@@ -124,7 +124,16 @@ class InterpState final : public State {
 
   /// Note that a step has been executed. If there are no more steps remaining,
   /// diagnoses and returns \c false.
-  bool noteStep(CodePtr OpPC);
+  bool noteStep(CodePtr OpPC) {
+    if (InfiniteSteps)
+      return true;
+
+    --StepsLeft;
+    if (LLVM_LIKELY(StepsLeft != 0))
+      return true;
+
+    return diagnoseStepLimitExceeded(OpPC);
+  }
 
   bool initializingBlock(const Block *B) const {
     for (PtrView V : InitializingPtrs)
@@ -171,6 +180,8 @@ class InterpState final : public State {
   std::unique_ptr<DynamicAllocator> Alloc;
   /// Allocator for everything else, e.g. floating-point values.
   mutable std::optional<llvm::BumpPtrAllocator> Allocator;
+  /// Diagnose that we've reached the constexpr step limit.
+  bool diagnoseStepLimitExceeded(CodePtr OpPC);
 
 public:
   CodePtr PC;


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to