From: Alexey Bataev Date: Tue, 30 Mar 2021 19:53:25 +0000 (-0700) Subject: [OPENMP]Fix PR48607: Crash during clang openmp codegen for firstprivate() of `float... X-Git-Tag: llvmorg-14-init~10871 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e2c7bf08cc8e9c2461dd18b283b76ed2b3c59630;p=platform%2Fupstream%2Fllvm.git [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 --- diff --git a/clang/lib/CodeGen/CGStmtOpenMP.cpp b/clang/lib/CodeGen/CGStmtOpenMP.cpp index 9a675a8..5373805 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 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 0000000..f67bdae --- /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]])