rogfer01 created this revision. rogfer01 added a reviewer: ABataev. Herald added subscribers: guansong, yaxunl. rogfer01 requested review of this revision. Herald added a reviewer: jdoerfert. Herald added subscribers: cfe-commits, sstefan1. Herald added a project: clang.
We were using an `OpaqueValueExpr` allocated on the stack to store the size of a VLA. Because the `VLASizeMap` in `CodegenFunction` uses the address of the expression to avoid recomputing VLAs, we were accidentally reusing an earlier `llvm::Value`. This led to invalid LLVM IR. After this change, we allocate the `OpaqueValueExpr` in `ASTContext` rather than in the stack. This is a temporary solution until `VLASizeMap` can be pushed and popped based on the context. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D107666 Files: clang/lib/CodeGen/CGOpenMPRuntime.cpp clang/test/OpenMP/vla_iterator_cache_bug.c Index: clang/test/OpenMP/vla_iterator_cache_bug.c =================================================================== --- /dev/null +++ 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 +} Index: clang/lib/CodeGen/CGOpenMPRuntime.cpp =================================================================== --- clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -4400,14 +4400,14 @@ 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, @@ -4898,13 +4898,13 @@ 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.
Index: clang/test/OpenMP/vla_iterator_cache_bug.c =================================================================== --- /dev/null +++ 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 +} Index: clang/lib/CodeGen/CGOpenMPRuntime.cpp =================================================================== --- clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -4400,14 +4400,14 @@ 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, @@ -4898,13 +4898,13 @@ 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.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits