Index: lib/IR/InlineAsm.cpp |
diff --git a/lib/IR/InlineAsm.cpp b/lib/IR/InlineAsm.cpp |
index 16d874f32fc39a76eb684d9a9cfe9e484822f05f..32a5ea8be2d9f15518d07be6046204f81ee7a5e2 100644 |
--- a/lib/IR/InlineAsm.cpp |
+++ b/lib/IR/InlineAsm.cpp |
@@ -287,3 +287,18 @@ bool InlineAsm::Verify(FunctionType *Ty, StringRef ConstStr) { |
return true; |
} |
+// @LOCALMOD-START |
+bool InlineAsm::isAsmMemory() const { |
+ bool retVoid = getFunctionType()->getReturnType()->isVoidTy(); |
+ bool noArgs = getFunctionType()->getNumParams() == 0 && |
+ !getFunctionType()->isVarArg(); |
+ bool isEmptyAsm = AsmString.empty(); |
+ // Different triples will encode "touch everything" differently, e.g.: |
+ // - le32-unknown-nacl has "~{memory}". |
+ // - x86 "~{memory},~{dirflag},~{fpsr},~{flags}". |
+ // The following code therefore only searches for memory. |
+ bool touchesMemory = Constraints.find("~{memory}") != std::string::npos; |
+ |
+ return retVoid && noArgs && hasSideEffects() && isEmptyAsm && touchesMemory; |
+} |
+// @LOCALMOD-END |