[clang] 18581fd - [CFE] Add nomerge function attribute to inline assembly.
via cfe-commits
cfe-commits at lists.llvm.org
Tue Jul 21 17:25:35 PDT 2020
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 }
More information about the cfe-commits
mailing list