Index: llvm/lib/Transforms/IPO/FunctionAttrs.cpp =================================================================== --- llvm/lib/Transforms/IPO/FunctionAttrs.cpp +++ llvm/lib/Transforms/IPO/FunctionAttrs.cpp @@ -1271,15 +1271,10 @@ if (CB->hasFnAttr(Attribute::NoFree)) return false; - Function *Callee = CB->getCalledFunction(); - if (!Callee) - return true; - - if (Callee->doesNotFreeMemory()) - return false; - - if (SCCNodes.contains(Callee)) - return false; + // Speculatively assume in SCC. + if (Function *Callee = CB->getCalledFunction()) + if (SCCNodes.contains(Callee)) + return false; return true; } @@ -1403,10 +1398,8 @@ } static bool instructionDoesNotReturn(Instruction &I) { - if (auto *CB = dyn_cast(&I)) { - Function *Callee = CB->getCalledFunction(); - return Callee && Callee->doesNotReturn(); - } + if (auto *CB = dyn_cast(&I)) + return CB->hasFnAttr(Attribute::NoReturn); return false; } @@ -1517,13 +1510,6 @@ if (CB->hasFnAttr(Attribute::NoSync)) return false; - // readnone + not convergent implies nosync - // (This is needed to initialize inference from declarations which aren't - // explicitly nosync, but are readnone and not convergent.) - if (CB->hasFnAttr(Attribute::ReadNone) && - !CB->hasFnAttr(Attribute::Convergent)) - return false; - // Non volatile memset/memcpy/memmoves are nosync // NOTE: Only intrinsics with volatile flags should be handled here. All // others should be marked in Intrinsics.td. Index: llvm/test/Transforms/FunctionAttrs/noreturn.ll =================================================================== --- llvm/test/Transforms/FunctionAttrs/noreturn.ll +++ llvm/test/Transforms/FunctionAttrs/noreturn.ll @@ -64,3 +64,10 @@ define i32 @alreadynoreturn() noreturn { unreachable } + +; CHECK: Function Attrs: {{.*}}noreturn +; CHECK-NEXT: @callsite_noreturn() +define void @callsite_noreturn() { + call i32 @f() noreturn + ret void +} Index: llvm/test/Transforms/FunctionAttrs/willreturn-callsites.ll =================================================================== --- llvm/test/Transforms/FunctionAttrs/willreturn-callsites.ll +++ llvm/test/Transforms/FunctionAttrs/willreturn-callsites.ll @@ -1,4 +1,4 @@ -; RUN: opt -function-attrs -S %s | FileCheck %s +; RUN: opt -inferattrs -function-attrs -S %s | FileCheck %s declare void @decl_readonly() readonly declare void @decl_readnone() readnone