diff options
Diffstat (limited to 'lib/CodeGen')
| -rw-r--r-- | lib/CodeGen/CGOpenMPRuntime.cpp | 16 | ||||
| -rw-r--r-- | lib/CodeGen/CGStmtOpenMP.cpp | 20 | ||||
| -rw-r--r-- | lib/CodeGen/CodeGenFunction.h | 2 | 
3 files changed, 21 insertions, 17 deletions
diff --git a/lib/CodeGen/CGOpenMPRuntime.cpp b/lib/CodeGen/CGOpenMPRuntime.cpp index 3b97ba2469ae..015a7396ffbe 100644 --- a/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/lib/CodeGen/CGOpenMPRuntime.cpp @@ -3548,14 +3548,16 @@ void CGOpenMPRuntime::emitReduction(CodeGenFunction &CGF, SourceLocation Loc,                E = CGF.EmitAnyExpr(EExpr);              CGF.EmitOMPAtomicSimpleUpdateExpr(                  X, E, BO, /*IsXLHSInRHSPart=*/true, llvm::Monotonic, Loc, -                [&CGF, UpExpr, VD, IPriv](RValue XRValue) { +                [&CGF, UpExpr, VD, IPriv, Loc](RValue XRValue) {                    CodeGenFunction::OMPPrivateScope PrivateScope(CGF); -                  PrivateScope.addPrivate(VD, [&CGF, VD, XRValue]() -> Address { -                    Address LHSTemp = CGF.CreateMemTemp(VD->getType()); -                    CGF.EmitStoreThroughLValue( -                        XRValue, CGF.MakeAddrLValue(LHSTemp, VD->getType())); -                    return LHSTemp; -                  }); +                  PrivateScope.addPrivate( +                      VD, [&CGF, VD, XRValue, Loc]() -> Address { +                        Address LHSTemp = CGF.CreateMemTemp(VD->getType()); +                        CGF.emitOMPSimpleStore( +                            CGF.MakeAddrLValue(LHSTemp, VD->getType()), XRValue, +                            VD->getType().getNonReferenceType(), Loc); +                        return LHSTemp; +                      });                    (void)PrivateScope.Privatize();                    return CGF.EmitAnyExpr(UpExpr);                  }); diff --git a/lib/CodeGen/CGStmtOpenMP.cpp b/lib/CodeGen/CGStmtOpenMP.cpp index 14917c20c535..68555128ea01 100644 --- a/lib/CodeGen/CGStmtOpenMP.cpp +++ b/lib/CodeGen/CGStmtOpenMP.cpp @@ -2163,17 +2163,17 @@ static void emitSimpleAtomicStore(CodeGenFunction &CGF, bool IsSeqCst,    }  } -static void emitSimpleStore(CodeGenFunction &CGF, LValue LVal, RValue RVal, -                            QualType RValTy, SourceLocation Loc) { -  switch (CGF.getEvaluationKind(LVal.getType())) { +void CodeGenFunction::emitOMPSimpleStore(LValue LVal, RValue RVal, +                                         QualType RValTy, SourceLocation Loc) { +  switch (getEvaluationKind(LVal.getType())) {    case TEK_Scalar: -    CGF.EmitStoreThroughLValue(RValue::get(convertToScalarValue( -                                   CGF, RVal, RValTy, LVal.getType(), Loc)), -                               LVal); +    EmitStoreThroughLValue(RValue::get(convertToScalarValue( +                               *this, RVal, RValTy, LVal.getType(), Loc)), +                           LVal);      break;    case TEK_Complex: -    CGF.EmitStoreOfComplex( -        convertToComplexValue(CGF, RVal, RValTy, LVal.getType(), Loc), LVal, +    EmitStoreOfComplex( +        convertToComplexValue(*this, RVal, RValTy, LVal.getType(), Loc), LVal,          /*isInit=*/false);      break;    case TEK_Aggregate: @@ -2201,7 +2201,7 @@ static void EmitOMPAtomicReadExpr(CodeGenFunction &CGF, bool IsSeqCst,    // list.    if (IsSeqCst)      CGF.CGM.getOpenMPRuntime().emitFlush(CGF, llvm::None, Loc); -  emitSimpleStore(CGF, VLValue, Res, X->getType().getNonReferenceType(), Loc); +  CGF.emitOMPSimpleStore(VLValue, Res, X->getType().getNonReferenceType(), Loc);  }  static void EmitOMPAtomicWriteExpr(CodeGenFunction &CGF, bool IsSeqCst, @@ -2459,7 +2459,7 @@ static void EmitOMPAtomicCaptureExpr(CodeGenFunction &CGF, bool IsSeqCst,      }    }    // Emit post-update store to 'v' of old/new 'x' value. -  emitSimpleStore(CGF, VLValue, NewVVal, NewVValType, Loc); +  CGF.emitOMPSimpleStore(VLValue, NewVVal, NewVValType, Loc);    // OpenMP, 2.12.6, atomic Construct    // Any atomic construct with a seq_cst clause forces the atomically    // performed operation to include an implicit flush operation without a diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index b3d50352532e..4803b13f58d9 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -2211,6 +2211,8 @@ public:    llvm::Function *GenerateOpenMPCapturedStmtFunction(const CapturedStmt &S);    void GenerateOpenMPCapturedVars(const CapturedStmt &S,                                    SmallVectorImpl<llvm::Value *> &CapturedVars); +  void emitOMPSimpleStore(LValue LVal, RValue RVal, QualType RValTy, +                          SourceLocation Loc);    /// \brief Perform element by element copying of arrays with type \a    /// OriginalType from \a SrcAddr to \a DestAddr using copying procedure    /// generated by \a CopyGen.  | 
