diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index ca98c7a5744653..90fcf2232be2fb 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -4401,14 +4401,14 @@ CGOpenMPRuntime::emitTaskInit(CodeGenFunction &CGF, SourceLocation Loc, if (NumOfElements) { NumOfElements = CGF.Builder.CreateNUWAdd( llvm::ConstantInt::get(CGF.SizeTy, NumAffinities), NumOfElements); - OpaqueValueExpr OVE( + auto *OVE = new (C) OpaqueValueExpr( Loc, C.getIntTypeForBitwidth(C.getTypeSize(C.getSizeType()), /*Signed=*/0), VK_PRValue); - CodeGenFunction::OpaqueValueMapping OpaqueMap(CGF, &OVE, + CodeGenFunction::OpaqueValueMapping OpaqueMap(CGF, OVE, RValue::get(NumOfElements)); KmpTaskAffinityInfoArrayTy = - C.getVariableArrayType(KmpTaskAffinityInfoTy, &OVE, ArrayType::Normal, + C.getVariableArrayType(KmpTaskAffinityInfoTy, OVE, ArrayType::Normal, /*IndexTypeQuals=*/0, SourceRange(Loc, Loc)); // Properly emit variable-sized array. auto *PD = ImplicitParamDecl::Create(C, KmpTaskAffinityInfoArrayTy, @@ -4899,13 +4899,13 @@ std::pair CGOpenMPRuntime::emitDependClause( NumOfElements = CGF.Builder.CreateNUWAdd(NumOfRegularWithIterators, NumOfElements); } - OpaqueValueExpr OVE(Loc, - C.getIntTypeForBitwidth(/*DestWidth=*/64, /*Signed=*/0), - VK_PRValue); - CodeGenFunction::OpaqueValueMapping OpaqueMap(CGF, &OVE, + auto *OVE = new (C) OpaqueValueExpr( + Loc, C.getIntTypeForBitwidth(/*DestWidth=*/64, /*Signed=*/0), + VK_PRValue); + CodeGenFunction::OpaqueValueMapping OpaqueMap(CGF, OVE, RValue::get(NumOfElements)); KmpDependInfoArrayTy = - C.getVariableArrayType(KmpDependInfoTy, &OVE, ArrayType::Normal, + C.getVariableArrayType(KmpDependInfoTy, OVE, ArrayType::Normal, /*IndexTypeQuals=*/0, SourceRange(Loc, Loc)); // CGF.EmitVariablyModifiedType(KmpDependInfoArrayTy); // Properly emit variable-sized array. diff --git a/clang/test/OpenMP/vla_iterator_cache_bug.c b/clang/test/OpenMP/vla_iterator_cache_bug.c new file mode 100644 index 00000000000000..ad5a664346e284 --- /dev/null +++ b/clang/test/OpenMP/vla_iterator_cache_bug.c @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-linux-gnu \ +// RUN: -emit-llvm %s -o - | FileCheck %s + +// expected-no-diagnostics + +extern int bounds1(int); +extern int bounds2(int); + +extern void fun2(int n, int *a, int *b); +extern void fun3(int n, int *a, int *b); + +void fun1(int n, int *a, int *b) +{ +#pragma omp task depend(iterator(j = 0 : bounds1(n)), in : a[b[j]]) + { + fun2(n, a, b); + } +// CHECK: alloca %struct.kmp_depend_info, i64 [[FIRST_VLA:%.*]], align 16 + +#pragma omp task depend(iterator(j = 0 : bounds2(n)), in : a[b[j]]) + { + fun3(n, a, b); + } +// CHECK-NOT: alloca %struct.kmp_depend_info, i64 [[FIRST_VLA]], align 16 +}