Author: abataev Date: Fri Mar 2 10:07:00 2018 New Revision: 326594 URL: http://llvm.org/viewvc/llvm-project?rev=326594&view=rev Log: [OPENMP] Scan all redeclarations looking for `declare simd` attribute.
Patch fixes the problem with the functions marked as `declare simd`. If the canonical declaration does not have associated `declare simd` construct, we may not generate required code even if other redeclarations are marked as `declare simd`. Modified: cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp cfe/trunk/test/OpenMP/declare_simd_codegen.cpp Modified: cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp?rev=326594&r1=326593&r2=326594&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp (original) +++ cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp Fri Mar 2 10:07:00 2018 @@ -7861,7 +7861,7 @@ emitX86DeclareSimdFunction(const Functio void CGOpenMPRuntime::emitDeclareSimdFunction(const FunctionDecl *FD, llvm::Function *Fn) { ASTContext &C = CGM.getContext(); - FD = FD->getCanonicalDecl(); + FD = FD->getMostRecentDecl(); // Map params to their positions in function decl. llvm::DenseMap<const Decl *, unsigned> ParamPositions; if (isa<CXXMethodDecl>(FD)) @@ -7871,80 +7871,84 @@ void CGOpenMPRuntime::emitDeclareSimdFun ParamPositions.insert({P->getCanonicalDecl(), ParamPos}); ++ParamPos; } - for (auto *Attr : FD->specific_attrs<OMPDeclareSimdDeclAttr>()) { - llvm::SmallVector<ParamAttrTy, 8> ParamAttrs(ParamPositions.size()); - // Mark uniform parameters. - for (auto *E : Attr->uniforms()) { - E = E->IgnoreParenImpCasts(); - unsigned Pos; - if (isa<CXXThisExpr>(E)) - Pos = ParamPositions[FD]; - else { - auto *PVD = cast<ParmVarDecl>(cast<DeclRefExpr>(E)->getDecl()) - ->getCanonicalDecl(); - Pos = ParamPositions[PVD]; - } - ParamAttrs[Pos].Kind = Uniform; - } - // Get alignment info. - auto NI = Attr->alignments_begin(); - for (auto *E : Attr->aligneds()) { - E = E->IgnoreParenImpCasts(); - unsigned Pos; - QualType ParmTy; - if (isa<CXXThisExpr>(E)) { - Pos = ParamPositions[FD]; - ParmTy = E->getType(); - } else { - auto *PVD = cast<ParmVarDecl>(cast<DeclRefExpr>(E)->getDecl()) - ->getCanonicalDecl(); - Pos = ParamPositions[PVD]; - ParmTy = PVD->getType(); + while (FD) { + for (auto *Attr : FD->specific_attrs<OMPDeclareSimdDeclAttr>()) { + llvm::SmallVector<ParamAttrTy, 8> ParamAttrs(ParamPositions.size()); + // Mark uniform parameters. + for (auto *E : Attr->uniforms()) { + E = E->IgnoreParenImpCasts(); + unsigned Pos; + if (isa<CXXThisExpr>(E)) + Pos = ParamPositions[FD]; + else { + auto *PVD = cast<ParmVarDecl>(cast<DeclRefExpr>(E)->getDecl()) + ->getCanonicalDecl(); + Pos = ParamPositions[PVD]; + } + ParamAttrs[Pos].Kind = Uniform; } - ParamAttrs[Pos].Alignment = - (*NI) ? (*NI)->EvaluateKnownConstInt(C) + // Get alignment info. + auto NI = Attr->alignments_begin(); + for (auto *E : Attr->aligneds()) { + E = E->IgnoreParenImpCasts(); + unsigned Pos; + QualType ParmTy; + if (isa<CXXThisExpr>(E)) { + Pos = ParamPositions[FD]; + ParmTy = E->getType(); + } else { + auto *PVD = cast<ParmVarDecl>(cast<DeclRefExpr>(E)->getDecl()) + ->getCanonicalDecl(); + Pos = ParamPositions[PVD]; + ParmTy = PVD->getType(); + } + ParamAttrs[Pos].Alignment = + (*NI) + ? (*NI)->EvaluateKnownConstInt(C) : llvm::APSInt::getUnsigned( C.toCharUnitsFromBits(C.getOpenMPDefaultSimdAlign(ParmTy)) .getQuantity()); - ++NI; - } - // Mark linear parameters. - auto SI = Attr->steps_begin(); - auto MI = Attr->modifiers_begin(); - for (auto *E : Attr->linears()) { - E = E->IgnoreParenImpCasts(); - unsigned Pos; - if (isa<CXXThisExpr>(E)) - Pos = ParamPositions[FD]; - else { - auto *PVD = cast<ParmVarDecl>(cast<DeclRefExpr>(E)->getDecl()) - ->getCanonicalDecl(); - Pos = ParamPositions[PVD]; + ++NI; } - auto &ParamAttr = ParamAttrs[Pos]; - ParamAttr.Kind = Linear; - if (*SI) { - if (!(*SI)->EvaluateAsInt(ParamAttr.StrideOrArg, C, - Expr::SE_AllowSideEffects)) { - if (auto *DRE = cast<DeclRefExpr>((*SI)->IgnoreParenImpCasts())) { - if (auto *StridePVD = cast<ParmVarDecl>(DRE->getDecl())) { - ParamAttr.Kind = LinearWithVarStride; - ParamAttr.StrideOrArg = llvm::APSInt::getUnsigned( - ParamPositions[StridePVD->getCanonicalDecl()]); + // Mark linear parameters. + auto SI = Attr->steps_begin(); + auto MI = Attr->modifiers_begin(); + for (auto *E : Attr->linears()) { + E = E->IgnoreParenImpCasts(); + unsigned Pos; + if (isa<CXXThisExpr>(E)) + Pos = ParamPositions[FD]; + else { + auto *PVD = cast<ParmVarDecl>(cast<DeclRefExpr>(E)->getDecl()) + ->getCanonicalDecl(); + Pos = ParamPositions[PVD]; + } + auto &ParamAttr = ParamAttrs[Pos]; + ParamAttr.Kind = Linear; + if (*SI) { + if (!(*SI)->EvaluateAsInt(ParamAttr.StrideOrArg, C, + Expr::SE_AllowSideEffects)) { + if (auto *DRE = cast<DeclRefExpr>((*SI)->IgnoreParenImpCasts())) { + if (auto *StridePVD = cast<ParmVarDecl>(DRE->getDecl())) { + ParamAttr.Kind = LinearWithVarStride; + ParamAttr.StrideOrArg = llvm::APSInt::getUnsigned( + ParamPositions[StridePVD->getCanonicalDecl()]); + } } } } + ++SI; + ++MI; } - ++SI; - ++MI; + llvm::APSInt VLENVal; + if (const Expr *VLEN = Attr->getSimdlen()) + VLENVal = VLEN->EvaluateKnownConstInt(C); + OMPDeclareSimdDeclAttr::BranchStateTy State = Attr->getBranchState(); + if (CGM.getTriple().getArch() == llvm::Triple::x86 || + CGM.getTriple().getArch() == llvm::Triple::x86_64) + emitX86DeclareSimdFunction(FD, Fn, VLENVal, ParamAttrs, State); } - llvm::APSInt VLENVal; - if (const Expr *VLEN = Attr->getSimdlen()) - VLENVal = VLEN->EvaluateKnownConstInt(C); - OMPDeclareSimdDeclAttr::BranchStateTy State = Attr->getBranchState(); - if (CGM.getTriple().getArch() == llvm::Triple::x86 || - CGM.getTriple().getArch() == llvm::Triple::x86_64) - emitX86DeclareSimdFunction(FD, Fn, VLENVal, ParamAttrs, State); + FD = FD->getPreviousDecl(); } } Modified: cfe/trunk/test/OpenMP/declare_simd_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/declare_simd_codegen.cpp?rev=326594&r1=326593&r2=326594&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/declare_simd_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/declare_simd_codegen.cpp Fri Mar 2 10:07:00 2018 @@ -10,6 +10,8 @@ #ifndef HEADER #define HEADER +void add_1(float *d); + #pragma omp declare simd linear(d : 8) #pragma omp declare simd inbranch simdlen(32) #pragma omp declare simd notinbranch @@ -20,6 +22,8 @@ void add_1(float *d); #pragma omp declare simd notinbranch void add_1(float *d) {} +void add_1(float *d); + #pragma omp declare simd linear(d : 8) #pragma omp declare simd inbranch simdlen(32) #pragma omp declare simd notinbranch _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits