diff options
Diffstat (limited to 'clang/lib/CodeGen/CGStmtOpenMP.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGStmtOpenMP.cpp | 121 |
1 files changed, 2 insertions, 119 deletions
diff --git a/clang/lib/CodeGen/CGStmtOpenMP.cpp b/clang/lib/CodeGen/CGStmtOpenMP.cpp index 101c3e717e8..78fd37ce656 100644 --- a/clang/lib/CodeGen/CGStmtOpenMP.cpp +++ b/clang/lib/CodeGen/CGStmtOpenMP.cpp @@ -691,125 +691,8 @@ void CodeGenFunction::EmitOMPOrderedDirective(const OMPOrderedDirective &) { llvm_unreachable("CodeGen for 'omp ordered' is not supported yet."); } -static llvm::Value *convertToScalarValue(CodeGenFunction &CGF, RValue Val, - QualType SrcType, QualType DestType) { - assert(CGF.hasScalarEvaluationKind(DestType) && - "DestType must have scalar evaluation kind."); - assert(!Val.isAggregate() && "Must be a scalar or complex."); - return Val.isScalar() - ? CGF.EmitScalarConversion(Val.getScalarVal(), SrcType, DestType) - : CGF.EmitComplexToScalarConversion(Val.getComplexVal(), SrcType, - DestType); -} - -static CodeGenFunction::ComplexPairTy -convertToComplexValue(CodeGenFunction &CGF, RValue Val, QualType SrcType, - QualType DestType) { - assert(CGF.getEvaluationKind(DestType) == TEK_Complex && - "DestType must have complex evaluation kind."); - CodeGenFunction::ComplexPairTy ComplexVal; - if (Val.isScalar()) { - // Convert the input element to the element type of the complex. - auto DestElementType = DestType->castAs<ComplexType>()->getElementType(); - auto ScalarVal = - CGF.EmitScalarConversion(Val.getScalarVal(), SrcType, DestElementType); - ComplexVal = CodeGenFunction::ComplexPairTy( - ScalarVal, llvm::Constant::getNullValue(ScalarVal->getType())); - } else { - assert(Val.isComplex() && "Must be a scalar or complex."); - auto SrcElementType = SrcType->castAs<ComplexType>()->getElementType(); - auto DestElementType = DestType->castAs<ComplexType>()->getElementType(); - ComplexVal.first = CGF.EmitScalarConversion( - Val.getComplexVal().first, SrcElementType, DestElementType); - ComplexVal.second = CGF.EmitScalarConversion( - Val.getComplexVal().second, SrcElementType, DestElementType); - } - return ComplexVal; -} - -static void EmitOMPAtomicReadExpr(CodeGenFunction &CGF, bool IsSeqCst, - const Expr *X, const Expr *V, - SourceLocation Loc) { - // v = x; - assert(V->isLValue() && "V of 'omp atomic read' is not lvalue"); - assert(X->isLValue() && "X of 'omp atomic read' is not lvalue"); - LValue XLValue = CGF.EmitLValue(X); - LValue VLValue = CGF.EmitLValue(V); - RValue Res = XLValue.isGlobalReg() ? CGF.EmitLoadOfLValue(XLValue, Loc) - : CGF.EmitAtomicLoad(XLValue, 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 - // list. - if (IsSeqCst) - CGF.CGM.getOpenMPRuntime().EmitOMPFlush(CGF, llvm::None, Loc); - switch (CGF.getEvaluationKind(V->getType())) { - case TEK_Scalar: - CGF.EmitStoreOfScalar( - convertToScalarValue(CGF, Res, X->getType(), V->getType()), VLValue); - break; - case TEK_Complex: - CGF.EmitStoreOfComplex( - convertToComplexValue(CGF, Res, X->getType(), V->getType()), VLValue, - /*isInit=*/false); - break; - case TEK_Aggregate: - llvm_unreachable("Must be a scalar or complex."); - } -} - -static void EmitOMPAtomicExpr(CodeGenFunction &CGF, OpenMPClauseKind Kind, - bool IsSeqCst, const Expr *X, const Expr *V, - const Expr *, SourceLocation Loc) { - switch (Kind) { - case OMPC_read: - EmitOMPAtomicReadExpr(CGF, IsSeqCst, X, V, Loc); - break; - case OMPC_write: - case OMPC_update: - case OMPC_capture: - llvm_unreachable("CodeGen for 'omp atomic clause' is not supported yet."); - case OMPC_if: - case OMPC_final: - case OMPC_num_threads: - case OMPC_private: - case OMPC_firstprivate: - case OMPC_lastprivate: - case OMPC_reduction: - case OMPC_safelen: - case OMPC_collapse: - case OMPC_default: - case OMPC_seq_cst: - case OMPC_shared: - case OMPC_linear: - case OMPC_aligned: - case OMPC_copyin: - case OMPC_copyprivate: - case OMPC_flush: - case OMPC_proc_bind: - case OMPC_schedule: - case OMPC_ordered: - case OMPC_nowait: - case OMPC_untied: - case OMPC_threadprivate: - case OMPC_mergeable: - case OMPC_unknown: - llvm_unreachable("Clause is not allowed in 'omp atomic'."); - } -} - -void CodeGenFunction::EmitOMPAtomicDirective(const OMPAtomicDirective &S) { - bool IsSeqCst = S.getSingleClause(/*K=*/OMPC_seq_cst); - OpenMPClauseKind Kind = OMPC_unknown; - for (auto *C : S.clauses()) { - // Find first clause (skip seq_cst clause, if it is first). - if (C->getClauseKind() != OMPC_seq_cst) { - Kind = C->getClauseKind(); - break; - } - } - EmitOMPAtomicExpr(*this, Kind, IsSeqCst, S.getX(), S.getV(), S.getExpr(), - S.getLocStart()); +void CodeGenFunction::EmitOMPAtomicDirective(const OMPAtomicDirective &) { + llvm_unreachable("CodeGen for 'omp atomic' is not supported yet."); } void CodeGenFunction::EmitOMPTargetDirective(const OMPTargetDirective &) { |