Author: abataev Date: Thu Mar 8 07:24:08 2018 New Revision: 327008 URL: http://llvm.org/viewvc/llvm-project?rev=327008&view=rev Log: [OPENMP] Emit sizes/init ptrs etc. data for task reductions before using.
We may emit the code in wrong order because of incorrect implementation of the runtime functions for task reductions. Threadprivate storages may be initialized after real initialization of the reduction items. Patch fixes this problem. Modified: cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp cfe/trunk/test/OpenMP/task_in_reduction_codegen.cpp cfe/trunk/test/OpenMP/taskloop_reduction_codegen.cpp Modified: cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp?rev=327008&r1=327007&r2=327008&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp (original) +++ cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp Thu Mar 8 07:24:08 2018 @@ -2886,6 +2886,11 @@ void CodeGenFunction::EmitOMPTaskBasedDi for (unsigned Cnt = 0, E = Data.ReductionVars.size(); Cnt < E; ++Cnt) { RedCG.emitSharedLValue(CGF, Cnt); RedCG.emitAggregateType(CGF, Cnt); + // FIXME: This must removed once the runtime library is fixed. + // Emit required threadprivate variables for + // initilizer/combiner/finalizer. + CGF.CGM.getOpenMPRuntime().emitTaskReductionFixups(CGF, S.getLocStart(), + RedCG, Cnt); Address Replacement = CGF.CGM.getOpenMPRuntime().getTaskReductionItem( CGF, S.getLocStart(), ReductionsPtr, RedCG.getSharedLValue(Cnt)); Replacement = @@ -2898,11 +2903,6 @@ void CodeGenFunction::EmitOMPTaskBasedDi Replacement = RedCG.adjustPrivateAddress(CGF, Cnt, Replacement); Scope.addPrivate(RedCG.getBaseDecl(Cnt), [Replacement]() { return Replacement; }); - // FIXME: This must removed once the runtime library is fixed. - // Emit required threadprivate variables for - // initilizer/combiner/finalizer. - CGF.CGM.getOpenMPRuntime().emitTaskReductionFixups(CGF, S.getLocStart(), - RedCG, Cnt); } } // Privatize all private variables except for in_reduction items. @@ -2935,6 +2935,11 @@ void CodeGenFunction::EmitOMPTaskBasedDi RedCG.emitAggregateType(CGF, Cnt); // The taskgroup descriptor variable is always implicit firstprivate and // privatized already during procoessing of the firstprivates. + // FIXME: This must removed once the runtime library is fixed. + // Emit required threadprivate variables for + // initilizer/combiner/finalizer. + CGF.CGM.getOpenMPRuntime().emitTaskReductionFixups(CGF, S.getLocStart(), + RedCG, Cnt); llvm::Value *ReductionsPtr = CGF.EmitLoadOfScalar(CGF.EmitLValue(TaskgroupDescriptors[Cnt]), TaskgroupDescriptors[Cnt]->getExprLoc()); @@ -2949,11 +2954,6 @@ void CodeGenFunction::EmitOMPTaskBasedDi Replacement = RedCG.adjustPrivateAddress(CGF, Cnt, Replacement); InRedScope.addPrivate(RedCG.getBaseDecl(Cnt), [Replacement]() { return Replacement; }); - // FIXME: This must removed once the runtime library is fixed. - // Emit required threadprivate variables for - // initilizer/combiner/finalizer. - CGF.CGM.getOpenMPRuntime().emitTaskReductionFixups(CGF, S.getLocStart(), - RedCG, Cnt); } } (void)InRedScope.Privatize(); Modified: cfe/trunk/test/OpenMP/task_in_reduction_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/task_in_reduction_codegen.cpp?rev=327008&r1=327007&r2=327008&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/task_in_reduction_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/task_in_reduction_codegen.cpp Thu Mar 8 07:24:08 2018 @@ -78,9 +78,11 @@ int main(int argc, char **argv) { // CHECK-NEXT: call i8* @__kmpc_task_reduction_get_th_data(i32 [[GTID]], i8* [[TD1]], i8* [[A_PTR]]) // CHECK: [[D_REF:%.+]] = getelementptr inbounds % // CHECK-NEXT: [[D_ADDR:%.+]] = load i16*, i16** [[D_REF]], +// CHECK: call i8* @__kmpc_threadprivate_cached( // CHECK: [[TD2:%.+]] = load i8*, i8** [[TD2_ADDR]], // CHECK-NEXT: [[D_PTR:%.+]] = bitcast i16* [[D_ADDR]] to i8* // CHECK-NEXT: call i8* @__kmpc_task_reduction_get_th_data(i32 [[GTID]], i8* [[TD2]], i8* [[D_PTR]]) // CHECK: add nsw i32 // CHECK: store i32 % +// CHECK-NOT: call i8* @__kmpc_threadprivate_cached( #endif Modified: cfe/trunk/test/OpenMP/taskloop_reduction_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/taskloop_reduction_codegen.cpp?rev=327008&r1=327007&r2=327008&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/taskloop_reduction_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/taskloop_reduction_codegen.cpp Thu Mar 8 07:24:08 2018 @@ -199,6 +199,17 @@ sum = 0.0; // CHECK: store float %{{.+}}, float* % // CHECK: ret void +// CHECK-NOT: call i8* @__kmpc_threadprivate_cached( +// CHECK: call i8* @__kmpc_task_reduction_get_th_data( +// CHECK: call i8* @__kmpc_threadprivate_cached( +// CHECK: call i8* @__kmpc_threadprivate_cached( +// CHECK: call i8* @__kmpc_task_reduction_get_th_data( +// CHECK-NOT: call i8* @__kmpc_threadprivate_cached( +// CHECK: call i8* @__kmpc_task_reduction_get_th_data( +// CHECK: call i8* @__kmpc_threadprivate_cached( +// CHECK: call i8* @__kmpc_task_reduction_get_th_data( +// CHECK-NOT: call i8* @__kmpc_threadprivate_cached( + // CHECK-DAG: distinct !DISubprogram(linkageName: "[[TASK]]", scope: ! // CHECK-DAG: !DISubprogram(linkageName: "[[RED_INIT1]]" // CHECK-DAG: !DISubprogram(linkageName: "[[RED_COMB1]]" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits