diff options
Diffstat (limited to 'llvm/lib/Transforms/Utils/BuildLibCalls.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/BuildLibCalls.cpp | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp index 7a5326c..594dd06 100644 --- a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp +++ b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp @@ -76,42 +76,46 @@ static bool setNoReturn(Function &F) { return true; } +static bool setMemoryEffects(Function &F, MemoryEffects ME) { + MemoryEffects OrigME = F.getMemoryEffects(); + MemoryEffects NewME = OrigME & ME; + if (OrigME == NewME) + return false; + F.setMemoryEffects(NewME); + return true; +} + static bool setOnlyAccessesInaccessibleMemory(Function &F) { - if (F.onlyAccessesInaccessibleMemory()) + if (!setMemoryEffects(F, MemoryEffects::inaccessibleMemOnly())) return false; - F.setOnlyAccessesInaccessibleMemory(); ++NumInaccessibleMemOnly; return true; } static bool setOnlyReadsMemory(Function &F) { - if (F.onlyReadsMemory()) + if (!setMemoryEffects(F, MemoryEffects::readOnly())) return false; - F.setOnlyReadsMemory(); ++NumReadOnly; return true; } static bool setOnlyWritesMemory(Function &F) { - if (F.onlyWritesMemory()) // writeonly or readnone + if (!setMemoryEffects(F, MemoryEffects::writeOnly())) return false; ++NumWriteOnly; - F.setOnlyWritesMemory(); return true; } static bool setOnlyAccessesArgMemory(Function &F) { - if (F.onlyAccessesArgMemory()) + if (!setMemoryEffects(F, MemoryEffects::argMemOnly())) return false; - F.setOnlyAccessesArgMemory(); ++NumArgMemOnly; return true; } static bool setOnlyAccessesInaccessibleMemOrArgMem(Function &F) { - if (F.onlyAccessesInaccessibleMemOrArgMem()) + if (!setMemoryEffects(F, MemoryEffects::inaccessibleOrArgMemOnly())) return false; - F.setOnlyAccessesInaccessibleMemOrArgMem(); ++NumInaccessibleMemOrArgMemOnly; return true; } |