[FuncAttrs] Don't infer willreturn for nonexact definitions

Discovered during attributor testing comparing stats with
and without the attributor. Willreturn should not be inferred
for nonexact definitions.

Differential Revision: https://reviews.llvm.org/D100988
This commit is contained in:
sstefan1 2021-04-21 21:02:28 +02:00
parent 6ae7fc0a29
commit 62cdcd6c5a
2 changed files with 13 additions and 0 deletions

View File

@ -1432,6 +1432,12 @@ static bool addNoReturnAttrs(const SCCNodeSet &SCCNodes) {
}
static bool functionWillReturn(const Function &F) {
// We can infer and propagate function attributes only when we know that the
// definition we'll get at link time is *exactly* the definition we see now.
// For more details, see GlobalValue::mayBeDerefined.
if (!F.hasExactDefinition())
return false;
// Must-progress function without side-effects must return.
if (F.mustProgress() && F.onlyReadsMemory())
return true;

View File

@ -153,5 +153,12 @@ bb2:
br label %bb1
}
define linkonce i32 @square(i32) {
; CHECK-NOT: Function Attrs: {{.*}}willreturn
; CHECK: define linkonce i32 @square(
%2 = mul nsw i32 %0, %0
ret i32 %2
}
declare i64 @fn_noread() readnone
declare void @fn_willreturn() willreturn