diff --git a/clang/test/OpenMP/parallel_codegen.cpp b/clang/test/OpenMP/parallel_codegen.cpp index d545b4a9d9fa8..9082f1c3232af 100644 --- a/clang/test/OpenMP/parallel_codegen.cpp +++ b/clang/test/OpenMP/parallel_codegen.cpp @@ -822,8 +822,8 @@ int main (int argc, char **argv) { // CHECK3-NEXT: [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4 // CHECK3-NEXT: store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4 // CHECK3-NEXT: [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4 -// CHECK3-NEXT: [[TMP2:%.*]] = load i64, ptr [[LOADGEP__RELOADED]], align 8 // CHECK3-NEXT: [[VAR:%.*]] = alloca ptr, align 8 +// CHECK3-NEXT: [[TMP2:%.*]] = load i64, ptr [[LOADGEP__RELOADED]], align 8 // CHECK3-NEXT: br label [[OMP_PAR_REGION:%.*]] // CHECK3: omp.par.region: // CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[LOADGEP_ARGC_ADDR]], align 8 @@ -966,8 +966,8 @@ int main (int argc, char **argv) { // CHECK4-NEXT: [[TMP1:%.*]] = load i32, ptr [[TID_ADDR]], align 4 // CHECK4-NEXT: store i32 [[TMP1]], ptr [[TID_ADDR_LOCAL]], align 4 // CHECK4-NEXT: [[TID:%.*]] = load i32, ptr [[TID_ADDR_LOCAL]], align 4 -// CHECK4-NEXT: [[TMP2:%.*]] = load i64, ptr [[LOADGEP__RELOADED]], align 8 // CHECK4-NEXT: [[VAR:%.*]] = alloca ptr, align 8 +// CHECK4-NEXT: [[TMP2:%.*]] = load i64, ptr [[LOADGEP__RELOADED]], align 8 // CHECK4-NEXT: br label [[OMP_PAR_REGION:%.*]] // CHECK4: omp.par.region: // CHECK4-NEXT: [[TMP3:%.*]] = load ptr, ptr [[LOADGEP_ARGC_ADDR]], align 8, !dbg [[DBG58:![0-9]+]] diff --git a/flang/test/Lower/OpenMP/delayed-privatization-lower-allocatable-to-llvm.f90 b/flang/test/Lower/OpenMP/delayed-privatization-lower-allocatable-to-llvm.f90 new file mode 100644 index 0000000000000..ac9a6d8746cf2 --- /dev/null +++ b/flang/test/Lower/OpenMP/delayed-privatization-lower-allocatable-to-llvm.f90 @@ -0,0 +1,23 @@ +! Tests the OMPIRBuilder can handle multiple privatization regions that contain +! multiple BBs (for example, for allocatables). + +! RUN: %flang -S -emit-llvm -fopenmp -mmlir --openmp-enable-delayed-privatization \ +! RUN: -o - %s 2>&1 | FileCheck %s + +subroutine foo(x) + integer, allocatable :: x, y +!$omp parallel private(x, y) + x = y +!$omp end parallel +end + +! CHECK-LABEL: define void @foo_ +! CHECK: ret void +! CHECK-NEXT: } + +! CHECK-LABEL: define internal void @foo_..omp_par +! CHECK-DAG: call ptr @malloc +! CHECK-DAG: call ptr @malloc +! CHECK-DAG: call void @free +! CHECK-DAG: call void @free +! CHECK: } diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp index cb4de9c8876dc..2c4b45255d059 100644 --- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -1583,6 +1583,10 @@ IRBuilder<>::InsertPoint OpenMPIRBuilder::createParallel( } else { Builder.restoreIP( PrivCB(InnerAllocaIP, Builder.saveIP(), V, *Inner, ReplacementValue)); + InnerAllocaIP = { + InnerAllocaIP.getBlock(), + InnerAllocaIP.getBlock()->getTerminator()->getIterator()}; + assert(ReplacementValue && "Expected copy/create callback to set replacement value!"); if (ReplacementValue == &V)