| 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
|
|
|