Skip to content

Commit

Permalink
[Inliner] Teach inliner to merge 'min-legal-vector-width' function at…
Browse files Browse the repository at this point in the history
…tribute

When we inline a function with a min-legal-vector-width attribute we need to make sure the caller also ends up with at least that vector width.

This patch is necessary to make always_inline functions like intrinsics propagate their min-legal-vector-width. Though nothing uses min-legal-vector-width yet.

A future patch will add heuristics to preventing inlining with different vector width mismatches. But that code would need to be in inline cost analysis which is separate from the code added here.

Differential Revision: https://reviews.llvm.org/D49162

llvm-svn: 337844
  • Loading branch information
topperc committed Jul 24, 2018
1 parent 1296c62 commit 1d504f7
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 0 deletions.
1 change: 1 addition & 0 deletions llvm/include/llvm/IR/Attributes.td
Expand Up @@ -235,3 +235,4 @@ def : MergeRule<"setOR<ProfileSampleAccurateAttr>">;
def : MergeRule<"adjustCallerSSPLevel">;
def : MergeRule<"adjustCallerStackProbes">;
def : MergeRule<"adjustCallerStackProbeSize">;
def : MergeRule<"adjustMinLegalVectorWidth">;
27 changes: 27 additions & 0 deletions llvm/lib/IR/Attributes.cpp
Expand Up @@ -1682,6 +1682,33 @@ adjustCallerStackProbeSize(Function &Caller, const Function &Callee) {
}
}

/// If the inlined function defines a min legal vector width, then ensure
/// the calling function has the same or larger min legal vector width. This
/// function is called after the inlining decision has been made so we have to
/// merge the attribute this way. Heuristics that would use
/// min-legal-vector-width to determine inline compatibility would need to be
/// handled as part of inline cost analysis.
static void
adjustMinLegalVectorWidth(Function &Caller, const Function &Callee) {
if (Callee.hasFnAttribute("min-legal-vector-width")) {
uint64_t CalleeVectorWidth;
Callee.getFnAttribute("min-legal-vector-width")
.getValueAsString()
.getAsInteger(0, CalleeVectorWidth);
if (Caller.hasFnAttribute("min-legal-vector-width")) {
uint64_t CallerVectorWidth;
Caller.getFnAttribute("min-legal-vector-width")
.getValueAsString()
.getAsInteger(0, CallerVectorWidth);
if (CallerVectorWidth < CalleeVectorWidth) {
Caller.addFnAttr(Callee.getFnAttribute("min-legal-vector-width"));
}
} else {
Caller.addFnAttr(Callee.getFnAttribute("min-legal-vector-width"));
}
}
}

#define GET_ATTR_COMPAT_FUNC
#include "AttributesCompatFunc.inc"

Expand Down

0 comments on commit 1d504f7

Please sign in to comment.