https://github.com/efwright created 
https://github.com/llvm/llvm-project/pull/98668

Clang's CodeGenFunction tracks two insert points for "allocas". One where the 
alloca instructions are placed, and another (immediately following the allocas) 
where any address space casts are placed. For code outlining the two helper 
classes (OutlinedRegionBodyRAII and InlinedRegionBodyRAII) both change the 
first insert point which then causes a desync between the two insert points.

This changes nulls out the PostAllocaInsertPt whenever the AllocaInsertPt is 
changed which will cause those two insert points to sync up again the next time 
the PostAllocaInsertPt is referenced.

>From db22886b15f6bcab77b41846742f07639544bbe7 Mon Sep 17 00:00:00 2001
From: Eric Francis Wright <wright...@rzansel61.coral.llnl.gov>
Date: Fri, 12 Jul 2024 10:29:11 -0700
Subject: [PATCH] Update PostAllocaInsertPt when AllocaInsertPt is changed

---
 clang/lib/CodeGen/CodeGenFunction.h | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/clang/lib/CodeGen/CodeGenFunction.h 
b/clang/lib/CodeGen/CodeGenFunction.h
index cdb5ae6663405..2955949cbacdd 100644
--- a/clang/lib/CodeGen/CodeGenFunction.h
+++ b/clang/lib/CodeGen/CodeGenFunction.h
@@ -428,7 +428,6 @@ class CodeGenFunction : public CodeGenTypeCache {
   /// we prefer to insert allocas.
   llvm::AssertingVH<llvm::Instruction> AllocaInsertPt;
 
-private:
   /// PostAllocaInsertPt - This is a place in the prologue where code can be
   /// inserted that will be dominated by all the static allocas. This helps
   /// achieve two things:
@@ -439,7 +438,6 @@ class CodeGenFunction : public CodeGenTypeCache {
   /// PostAllocaInsertPt will be lazily created when it is *really* required.
   llvm::AssertingVH<llvm::Instruction> PostAllocaInsertPt = nullptr;
 
-public:
   /// Return PostAllocaInsertPt. If it is not yet created, then insert it
   /// immediately after AllocaInsertPt.
   llvm::Instruction *getPostAllocaInsertPoint() {
@@ -2004,11 +2002,17 @@ class CodeGenFunction : public CodeGenTypeCache {
 
         OldReturnBlock = CGF.ReturnBlock;
         CGF.ReturnBlock = CGF.getJumpDestInCurrentScope(&RetBB);
+
+        CGF.PostAllocaInsertPt = nullptr;
+
       }
 
       ~OutlinedRegionBodyRAII() {
         CGF.AllocaInsertPt = OldAllocaIP;
         CGF.ReturnBlock = OldReturnBlock;
+
+        CGF.PostAllocaInsertPt = nullptr;
+
       }
     };
 
@@ -2031,8 +2035,10 @@ class CodeGenFunction : public CodeGenTypeCache {
                "Insertion point should be in the entry block of containing "
                "function!");
         OldAllocaIP = CGF.AllocaInsertPt;
-        if (AllocaIP.isSet())
+        if (AllocaIP.isSet()) {
           CGF.AllocaInsertPt = &*AllocaIP.getPoint();
+          CGF.PostAllocaInsertPt = nullptr;
+        }
 
         // TODO: Remove the call, after making sure the counter is not used by
         //       the EHStack.
@@ -2042,7 +2048,11 @@ class CodeGenFunction : public CodeGenTypeCache {
         (void)CGF.getJumpDestInCurrentScope(&FiniBB);
       }
 
-      ~InlinedRegionBodyRAII() { CGF.AllocaInsertPt = OldAllocaIP; }
+      ~InlinedRegionBodyRAII()
+      {
+        CGF.AllocaInsertPt = OldAllocaIP;
+        CGF.PostAllocaInsertPt = nullptr;
+      }
     };
   };
 

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to