diff --git a/llvm/include/llvm/IR/Attributes.td b/llvm/include/llvm/IR/Attributes.td --- a/llvm/include/llvm/IR/Attributes.td +++ b/llvm/include/llvm/IR/Attributes.td @@ -107,7 +107,7 @@ def NoReturn : EnumAttr<"noreturn">; /// Function does not synchronize. -def NoSync : StrBoolAttr<"nofree">; +def NoSync : StrBoolAttr<"nosync">; /// Disable Indirect Branch Tracking. def NoCfCheck : EnumAttr<"nocf_check">; diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp --- a/llvm/lib/Transforms/IPO/Attributor.cpp +++ b/llvm/lib/Transforms/IPO/Attributor.cpp @@ -415,15 +415,13 @@ Failure == AtomicOrdering::Monotonic) return false; default: - Ordering = AtomicOrdering::NotAtomic; - - break; - // Relaxed. - if (Ordering == AtomicOrdering::Unordered || - Ordering == AtomicOrdering::Monotonic) - return false; return true; } + // Relaxed. + if (Ordering == AtomicOrdering::Unordered || + Ordering == AtomicOrdering::Monotonic) + return false; + return true; } bool AANoSyncFunction::isVolatile(Instruction *I) const { @@ -448,12 +446,9 @@ /// FIXME: We should ipmrove the handling of intrinsics. for (Instruction *I : InfoCache.getReadOrWriteInstsForFunction(F)) { ImmutableCallSite ICS(I); - if(!ICS) - continue; - auto *NoSyncAA = A.getAAFor(*this, *I); - if ((!NoSyncAA || !NoSyncAA->isAssumedNoSync()) && + if (!ICS && (!NoSyncAA || !NoSyncAA->isAssumedNoSync()) && !ICS.hasFnAttr("nosync")) { indicatePessimisticFixpoint(); return ChangeStatus::CHANGED;