[cfe-dev] [OpenMP]: wrong threadprivate storage name in task reduction

Raúl Peñacoba via cfe-dev cfe-dev at lists.llvm.org
Tue Mar 6 01:25:10 PST 2018


Hi,

I've noticed that clang does not work properly when using task 
reductions with non-constant arrays and/or classes with omp_orig 
constructor initializers.

As reduction initialize/combine/finalize functions only receive 
references to whatever should be initialized, combined..., clang 
generates some additional storages to save the size of the reduction 
array and a pointer to the omp_orig. That storages are generated through 
__kmpc_thread_private_cached() calls in both reduction functions and 
outline task function.

The problem is that the storage used in outline task function does not 
match the storage in reduction functions. This happens in programs that 
have a task reduction or a taskloop reduction with the in_reduction clause.

To solve this i made an ugly patch that reuses the SourceLocation of 
CodeGenFunction::EmitOMPTaskgroupDirective() in 
CodeGenFunction::EmitOMPTaskBasedDirective() to match the storages and 
make it work. Anyway, i suppose that there is a better way to fix this.

Index: CGStmtOpenMP.cpp
===================================================================
--- CGStmtOpenMP.cpp    (revision 326685)
+++ CGStmtOpenMP.cpp    (working copy)
@@ -2713,6 +2713,8 @@
                                   emitEmptyBoundParameters);
  }

+static SourceLocation reductionLoc;
+
  void CodeGenFunction::EmitOMPTaskBasedDirective(
      const OMPExecutableDirective &S, const OpenMPDirectiveKind 
CapturedRegion,
      const RegionCodeGenTy &BodyGen, const TaskGenTy &TaskGen,
@@ -2952,7 +2954,7 @@
          // 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(),
+        CGF.CGM.getOpenMPRuntime().emitTaskReductionFixups(CGF, 
reductionLoc,
RedCG, Cnt);
        }
      }
@@ -3180,8 +3182,9 @@
            std::advance(IRHS, 1);
          }
        }
+      reductionLoc = S.getLocStart();
        llvm::Value *ReductionDesc =
-          CGF.CGM.getOpenMPRuntime().emitTaskReductionInit(CGF, 
S.getLocStart(),
+          CGF.CGM.getOpenMPRuntime().emitTaskReductionInit(CGF, 
reductionLoc,
LHSs, RHSs, Data);
        const auto *VD = cast<VarDecl>(cast<DeclRefExpr>(E)->getDecl());
        CGF.EmitVarDecl(*VD);

Regards,

Raúl


http://bsc.es/disclaimer



More information about the cfe-dev mailing list