Author: Alexey Bataev
Date: 2021-03-30T13:39:45-07:00
New Revision: e2c7bf08cc8e9c2461dd18b283b76ed2b3c59630

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

LOG: [OPENMP]Fix PR48607: Crash during clang openmp codegen for firstprivate() 
of `float _Complex`.

Need to cast the argument for the debug wrapper function call to the
corresponding parameter type to avoid crash.

Differential Revision: https://reviews.llvm.org/D99617

Added: 
    clang/test/OpenMP/debug-info-complex-byval.cpp

Modified: 
    clang/lib/CodeGen/CGStmtOpenMP.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/CodeGen/CGStmtOpenMP.cpp 
b/clang/lib/CodeGen/CGStmtOpenMP.cpp
index 9a675a8870a22..5373805f0e1ca 100644
--- a/clang/lib/CodeGen/CGStmtOpenMP.cpp
+++ b/clang/lib/CodeGen/CGStmtOpenMP.cpp
@@ -634,6 +634,7 @@ CodeGenFunction::GenerateOpenMPCapturedStmtFunction(const 
CapturedStmt &S,
       emitOutlinedFunctionPrologue(WrapperCGF, Args, LocalAddrs, VLASizes,
                                    WrapperCGF.CXXThisValue, WrapperFO);
   llvm::SmallVector<llvm::Value *, 4> CallArgs;
+  auto *PI = F->arg_begin();
   for (const auto *Arg : Args) {
     llvm::Value *CallArg;
     auto I = LocalAddrs.find(Arg);
@@ -642,6 +643,11 @@ CodeGenFunction::GenerateOpenMPCapturedStmtFunction(const 
CapturedStmt &S,
           I->second.second,
           I->second.first ? I->second.first->getType() : Arg->getType(),
           AlignmentSource::Decl);
+      if (LV.getType()->isAnyComplexType())
+        LV.setAddress(WrapperCGF.Builder.CreatePointerBitCastOrAddrSpaceCast(
+            LV.getAddress(WrapperCGF),
+            PI->getType()->getPointerTo(
+                LV.getAddress(WrapperCGF).getAddressSpace())));
       CallArg = WrapperCGF.EmitLoadOfScalar(LV, S.getBeginLoc());
     } else {
       auto EI = VLASizes.find(Arg);
@@ -655,6 +661,7 @@ CodeGenFunction::GenerateOpenMPCapturedStmtFunction(const 
CapturedStmt &S,
       }
     }
     CallArgs.emplace_back(WrapperCGF.EmitFromMemory(CallArg, Arg->getType()));
+    ++PI;
   }
   CGM.getOpenMPRuntime().emitOutlinedFunctionCall(WrapperCGF, Loc, F, 
CallArgs);
   WrapperCGF.FinishFunction();

diff  --git a/clang/test/OpenMP/debug-info-complex-byval.cpp 
b/clang/test/OpenMP/debug-info-complex-byval.cpp
new file mode 100644
index 0000000000000..f67bdae20affb
--- /dev/null
+++ b/clang/test/OpenMP/debug-info-complex-byval.cpp
@@ -0,0 +1,22 @@
+// RUN: %clang_cc1 -fopenmp -x c++ %s -verify -debug-info-kind=limited -triple 
x86_64-unknown-unknown -emit-llvm -o - | FileCheck %s
+
+// RUN: %clang_cc1 -fopenmp-simd -x c++ %s -verify -debug-info-kind=limited 
-triple x86_64-unknown-unknown -emit-llvm -o - | FileCheck --check-prefix 
SIMD-ONLY0 %s
+// SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
+// expected-no-diagnostics
+
+void a() {
+  float _Complex b;
+  // CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) 
@__kmpc_fork_call(%struct.ident_t* {{.*}}, i32 1, void (i32*, i32*, ...)* 
bitcast (void (i32*, i32*, i64)* [[OUTLINED:@.+]] to void (i32*, i32*, ...)*), 
i64 %{{.*}})
+#pragma omp parallel firstprivate(b)
+  ;
+}
+
+// CHECK: define internal void [[OUTLINED_DEBUG:@.+]](i32* {{.*}}, i32* 
{{.*}}, <2 x float> {{.*}})
+
+// CHECK: define internal void [[OUTLINED]](i32* {{.*}}, i32* {{.*}}, i64 
[[B_VAL:%.+]])
+// CHECK: [[B_ADDR:%.+]] = alloca i64,
+// CHECK: store i64 [[B_VAL]], i64* [[B_ADDR]],
+// CHECK: [[CONV:%.+]] = bitcast i64* [[B_ADDR]] to { float, float }*,
+// CHECK: [[BC:%.+]] = bitcast { float, float }* [[CONV]] to <2 x float>*,
+// CHECK: [[B_VAL:%.+]] = load <2 x float>, <2 x float>* [[BC]],
+// CHECK: call void [[OUTLINED_DEBUG]](i32* %{{.+}}, i32* %{{.+}}, <2 x float> 
[[B_VAL]])


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

Reply via email to