Skip to content

Commit

Permalink
[inferattrs] Don't infer lib func attributes for nobuiltin functions
Browse files Browse the repository at this point in the history
If we have a nobuiltin function, we can't assume we know anything about the implementation.

I noticed this when tracing through a log from an in the wild miscompile (emscripten-core/emscripten#9443) triggered after 8666463.  We were incorrectly assuming that a custom allocator could not free.  (It's not clear yet this is the only problem in said issue.)

I also noticed something similiar mentioned in the commit message of ab243e when scrolling back through history.  Through, from what I can tell, that commit fixed symptom not root cause.

The interface we have for library function detection is extremely error prone, but given the interaction between ``nobuiltin`` decls and ``builtin`` callsites, it's really hard to imagine something much cleaner.  I may iterate on that, but it'll be invasive enough I didn't want to hold an obvious functional fix on it.
  • Loading branch information
preames committed Apr 16, 2021
1 parent bc636c1 commit 1170743
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 1 deletion.
3 changes: 2 additions & 1 deletion llvm/lib/Transforms/IPO/InferFunctionAttrs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ static bool inferAllPrototypeAttributes(
// attribute logic on all calls to declarations (as declarations aren't
// explicitly visited by CGSCC passes in the new pass manager.)
if (F.isDeclaration() && !F.hasOptNone()) {
Changed |= inferLibFuncAttributes(F, GetTLI(F));
if (!F.hasFnAttribute(Attribute::NoBuiltin))
Changed |= inferLibFuncAttributes(F, GetTLI(F));
Changed |= inferAttributesFromOthers(F);
}

Expand Down
5 changes: 5 additions & 0 deletions llvm/test/Transforms/InferFunctionAttrs/nobuiltin.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
; RUN: opt -S -inferattrs < %s | FileCheck %s

; CHECK: Function Attrs: nobuiltin allocsize(0)
; CHECK: declare i8* @_Znwm(i32)
declare i8* @_Znwm(i32) nobuiltin allocsize(0)

0 comments on commit 1170743

Please sign in to comment.