r371548 - Fix for PR43175: compiler crash when trying to emit noncapturable

Alexey Bataev via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 10 12:16:57 PDT 2019


Author: abataev
Date: Tue Sep 10 12:16:56 2019
New Revision: 371548

URL: http://llvm.org/viewvc/llvm-project?rev=371548&view=rev
Log:
Fix for PR43175: compiler crash when trying to emit noncapturable
constant.

If the constexpr variable is partially initialized, the initializer can
be emitted as the structure, not as an array, because of some early
optimizations. The llvm variable gets the type from this constant and,
thus, gets the type which is pointer to struct rather than pointer to an
array. We need to convert this type to be truely array, otherwise it may
lead to the compiler crash when trying to emit array subscript
expression.

Added:
    cfe/trunk/test/OpenMP/constexpr_partial_array.cpp
Modified:
    cfe/trunk/lib/CodeGen/CGExpr.cpp

Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=371548&r1=371547&r2=371548&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExpr.cpp Tue Sep 10 12:16:56 2019
@@ -2539,6 +2539,11 @@ LValue CodeGenFunction::EmitDeclRefLValu
         // Spill the constant value to a global.
         Addr = CGM.createUnnamedGlobalFrom(*VD, Val,
                                            getContext().getDeclAlign(VD));
+        llvm::Type *VarTy = getTypes().ConvertTypeForMem(VD->getType());
+        auto *PTy = llvm::PointerType::get(
+            VarTy, getContext().getTargetAddressSpace(VD->getType()));
+        if (PTy != Addr.getType())
+          Addr = Builder.CreatePointerBitCastOrAddrSpaceCast(Addr, PTy);
       } else {
         // Should we be using the alignment of the constant pointer we emitted?
         CharUnits Alignment =

Added: cfe/trunk/test/OpenMP/constexpr_partial_array.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/constexpr_partial_array.cpp?rev=371548&view=auto
==============================================================================
--- cfe/trunk/test/OpenMP/constexpr_partial_array.cpp (added)
+++ cfe/trunk/test/OpenMP/constexpr_partial_array.cpp Tue Sep 10 12:16:56 2019
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -verify -triple x86_64-pc-windows-msvc19.22.27905 -emit-llvm -o - -fopenmp %s | FileCheck %s
+// expected-no-diagnostics
+
+// CHECK: [[C_VAR_VAL:@.+]] = private unnamed_addr constant <{ i8, [26 x i8] }> <{ i8 1, [26 x i8] zeroinitializer }>,
+char a;
+bool b() {
+  static constexpr bool c[27]{1};
+  // CHECK: getelementptr inbounds [27 x i8], [27 x i8]* bitcast (<{ i8, [26 x i8] }>* [[C_VAR_VAL]] to [27 x i8]*),
+  return c[a];
+}




More information about the cfe-commits mailing list