[clang] [Clang][CodeGen] Fix bad codegen when building Clang with latest MSVC (PR #102681)

Alexandre Ganea via cfe-commits cfe-commits at lists.llvm.org
Sat Aug 10 13:16:44 PDT 2024


https://github.com/aganea updated https://github.com/llvm/llvm-project/pull/102681

>From 16efda65bb3d30b67b3215d7e8d69a105e2d771c Mon Sep 17 00:00:00 2001
From: Alexandre Ganea <aganea at havenstudios.com>
Date: Fri, 9 Aug 2024 16:32:09 -0400
Subject: [PATCH 1/2] [Clang][CodeGen] Fix a bad codegen when building Clang
 with latest MSVC

---
 clang/lib/CodeGen/CGObjCGNU.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/clang/lib/CodeGen/CGObjCGNU.cpp b/clang/lib/CodeGen/CGObjCGNU.cpp
index 948b10954ebbed..56a3ed1b87b35f 100644
--- a/clang/lib/CodeGen/CGObjCGNU.cpp
+++ b/clang/lib/CodeGen/CGObjCGNU.cpp
@@ -2092,10 +2092,10 @@ class CGObjCGNUstep2 : public CGObjCGNUstep {
         auto *classStart =
             llvm::StructType::get(PtrTy, PtrTy, PtrTy, LongTy, LongTy);
         auto &astContext = CGM.getContext();
-        auto flags = Builder.CreateLoad(
-            Address{Builder.CreateStructGEP(classStart, selfValue, 4), LongTy,
-                    CharUnits::fromQuantity(
-                        astContext.getTypeAlign(astContext.UnsignedLongTy))});
+        llvm::Value *Val = Builder.CreateStructGEP(classStart, selfValue, 4);
+        auto Align = CharUnits::fromQuantity(
+            astContext.getTypeAlign(astContext.UnsignedLongTy));
+        auto flags = Builder.CreateLoad(Address{Val, LongTy, Align});
         auto isInitialized =
             Builder.CreateAnd(flags, ClassFlags::ClassFlagInitialized);
         llvm::BasicBlock *notInitializedBlock =

>From 34b84af7a41cab1eab1e0ed046e656bbaa783fdc Mon Sep 17 00:00:00 2001
From: Alexandre Ganea <aganea at havenstudios.com>
Date: Sat, 10 Aug 2024 16:16:22 -0400
Subject: [PATCH 2/2] Add comment

---
 clang/lib/CodeGen/CGObjCGNU.cpp | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/clang/lib/CodeGen/CGObjCGNU.cpp b/clang/lib/CodeGen/CGObjCGNU.cpp
index 56a3ed1b87b35f..ca5804018227ea 100644
--- a/clang/lib/CodeGen/CGObjCGNU.cpp
+++ b/clang/lib/CodeGen/CGObjCGNU.cpp
@@ -2092,6 +2092,11 @@ class CGObjCGNUstep2 : public CGObjCGNUstep {
         auto *classStart =
             llvm::StructType::get(PtrTy, PtrTy, PtrTy, LongTy, LongTy);
         auto &astContext = CGM.getContext();
+        // FIXME: The following few lines up to and including the call to
+        // `CreateLoad` were known to miscompile when MSVC 19.40.33813 is used
+        // to build Clang. When the bug is fixed in future MSVC releases, we
+        // should revert these lines to their previous state. See discussion in
+        // https://github.com/llvm/llvm-project/pull/102681
         llvm::Value *Val = Builder.CreateStructGEP(classStart, selfValue, 4);
         auto Align = CharUnits::fromQuantity(
             astContext.getTypeAlign(astContext.UnsignedLongTy));



More information about the cfe-commits mailing list