Author: Wang, Pengfei Date: 2020-07-22T08:22:58+08:00 New Revision: 18581fd2c441eac052a25e4cbe9bd74d6ff605ad
URL: https://github.com/llvm/llvm-project/commit/18581fd2c441eac052a25e4cbe9bd74d6ff605ad DIFF: https://github.com/llvm/llvm-project/commit/18581fd2c441eac052a25e4cbe9bd74d6ff605ad.diff LOG: [CFE] Add nomerge function attribute to inline assembly. Sometimes we also want to avoid merging inline assembly. This patch add the nomerge function attribute to inline assembly. Reviewed By: zequanwu Differential Revision: https://reviews.llvm.org/D84225 Added: Modified: clang/lib/CodeGen/CGStmt.cpp clang/lib/Sema/SemaStmtAttr.cpp clang/test/CodeGen/attr-nomerge.cpp Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp index 672909849bb7..c2bd17a238d0 100644 --- a/clang/lib/CodeGen/CGStmt.cpp +++ b/clang/lib/CodeGen/CGStmt.cpp @@ -1954,12 +1954,16 @@ static llvm::MDNode *getAsmSrcLocInfo(const StringLiteral *Str, } static void UpdateAsmCallInst(llvm::CallBase &Result, bool HasSideEffect, - bool ReadOnly, bool ReadNone, const AsmStmt &S, + bool ReadOnly, bool ReadNone, bool NoMerge, + const AsmStmt &S, const std::vector<llvm::Type *> &ResultRegTypes, CodeGenFunction &CGF, std::vector<llvm::Value *> &RegResults) { Result.addAttribute(llvm::AttributeList::FunctionIndex, llvm::Attribute::NoUnwind); + if (NoMerge) + Result.addAttribute(llvm::AttributeList::FunctionIndex, + llvm::Attribute::NoMerge); // Attach readnone and readonly attributes. if (!HasSideEffect) { if (ReadNone) @@ -2334,12 +2338,14 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) { Builder.CreateCallBr(IA, Fallthrough, Transfer, Args); EmitBlock(Fallthrough); UpdateAsmCallInst(cast<llvm::CallBase>(*Result), HasSideEffect, ReadOnly, - ReadNone, S, ResultRegTypes, *this, RegResults); + ReadNone, InNoMergeAttributedStmt, S, ResultRegTypes, + *this, RegResults); } else { llvm::CallInst *Result = Builder.CreateCall(IA, Args, getBundlesForFunclet(IA)); UpdateAsmCallInst(cast<llvm::CallBase>(*Result), HasSideEffect, ReadOnly, - ReadNone, S, ResultRegTypes, *this, RegResults); + ReadNone, InNoMergeAttributedStmt, S, ResultRegTypes, + *this, RegResults); } assert(RegResults.size() == ResultRegTypes.size()); diff --git a/clang/lib/Sema/SemaStmtAttr.cpp b/clang/lib/Sema/SemaStmtAttr.cpp index e9d3c755eb23..eb56245e1954 100644 --- a/clang/lib/Sema/SemaStmtAttr.cpp +++ b/clang/lib/Sema/SemaStmtAttr.cpp @@ -183,6 +183,7 @@ class CallExprFinder : public ConstEvaluatedExprVisitor<CallExprFinder> { bool foundCallExpr() { return FoundCallExpr; } void VisitCallExpr(const CallExpr *E) { FoundCallExpr = true; } + void VisitAsmStmt(const AsmStmt *S) { FoundCallExpr = true; } void Visit(const Stmt *St) { if (!St) diff --git a/clang/test/CodeGen/attr-nomerge.cpp b/clang/test/CodeGen/attr-nomerge.cpp index 284ce7827966..3405ea737df1 100644 --- a/clang/test/CodeGen/attr-nomerge.cpp +++ b/clang/test/CodeGen/attr-nomerge.cpp @@ -10,6 +10,7 @@ void foo(int i) { [[clang::nomerge]] f(bar(), bar()); [[clang::nomerge]] [] { bar(); bar(); }(); // nomerge only applies to the anonymous function call [[clang::nomerge]] for (bar(); bar(); bar()) {} + [[clang::nomerge]] { asm("nop"); } bar(); } // CHECK: call zeroext i1 @_Z3barv() #[[NOMERGEATTR:[0-9]+]] @@ -22,5 +23,7 @@ void foo(int i) { // CHECK: call zeroext i1 @_Z3barv() #[[NOMERGEATTR]] // CHECK: call zeroext i1 @_Z3barv() #[[NOMERGEATTR]] // CHECK: call zeroext i1 @_Z3barv() #[[NOMERGEATTR]] +// CHECK: call void asm {{.*}} #[[NOMERGEATTR2:[0-9]+]] // CHECK: call zeroext i1 @_Z3barv() // CHECK: attributes #[[NOMERGEATTR]] = { nomerge } +// CHECK: attributes #[[NOMERGEATTR2]] = { nomerge nounwind } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits