[llvm] r315944 - Add !callees metadata
Matthew Simpson via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 16 15:22:11 PDT 2017
Author: mssimpso
Date: Mon Oct 16 15:22:11 2017
New Revision: 315944
URL: http://llvm.org/viewvc/llvm-project?rev=315944&view=rev
Log:
Add !callees metadata
This patch adds a new kind of metadata that indicates the possible callees of
indirect calls.
Differential Revision: https://reviews.llvm.org/D37354
Modified:
llvm/trunk/docs/LangRef.rst
llvm/trunk/include/llvm/IR/LLVMContext.h
llvm/trunk/include/llvm/IR/MDBuilder.h
llvm/trunk/lib/IR/LLVMContext.cpp
llvm/trunk/lib/IR/MDBuilder.cpp
llvm/trunk/test/ThinLTO/X86/lazyload_metadata.ll
Modified: llvm/trunk/docs/LangRef.rst
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.rst?rev=315944&r1=315943&r2=315944&view=diff
==============================================================================
--- llvm/trunk/docs/LangRef.rst (original)
+++ llvm/trunk/docs/LangRef.rst Mon Oct 16 15:22:11 2017
@@ -4878,6 +4878,23 @@ Example (assuming 64-bit pointers):
!0 = !{ i64 0, i64 256 }
!1 = !{ i64 -1, i64 -1 }
+'``callees``' Metadata
+^^^^^^^^^^^^^^^^^^^^^^
+
+``callees`` metadata may be attached to indirect call sites. If ``callees``
+metadata is attached to a call site, and any callee is not among the set of
+functions provided by the metadata, the behavior is undefined. The intent of
+this metadata is to facilitate optimizations such as indirect-call promotion.
+For example, in the code below, the call instruction may only target the
+``add`` or ``sub`` functions:
+
+.. code-block:: llvm
+
+ %result = call i64 %binop(i64 %x, i64 %y), !callees !0
+
+ ...
+ !0 = !{i64 (i64, i64)* @add, i64 (i64, i64)* @sub}
+
'``unpredictable``' Metadata
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Modified: llvm/trunk/include/llvm/IR/LLVMContext.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/LLVMContext.h?rev=315944&r1=315943&r2=315944&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/LLVMContext.h (original)
+++ llvm/trunk/include/llvm/IR/LLVMContext.h Mon Oct 16 15:22:11 2017
@@ -100,6 +100,7 @@ public:
MD_section_prefix = 20, // "section_prefix"
MD_absolute_symbol = 21, // "absolute_symbol"
MD_associated = 22, // "associated"
+ MD_callees = 23, // "callees"
};
/// Known operand bundle tag IDs, which always have the same value. All
Modified: llvm/trunk/include/llvm/IR/MDBuilder.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/MDBuilder.h?rev=315944&r1=315943&r2=315944&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/MDBuilder.h (original)
+++ llvm/trunk/include/llvm/IR/MDBuilder.h Mon Oct 16 15:22:11 2017
@@ -85,6 +85,14 @@ public:
MDNode *createRange(Constant *Lo, Constant *Hi);
//===------------------------------------------------------------------===//
+ // Callees metadata.
+ //===------------------------------------------------------------------===//
+
+ /// \brief Return metadata indicating the possible callees of indirect
+ /// calls.
+ MDNode *createCallees(ArrayRef<Function *> Callees);
+
+ //===------------------------------------------------------------------===//
// AA metadata.
//===------------------------------------------------------------------===//
Modified: llvm/trunk/lib/IR/LLVMContext.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContext.cpp?rev=315944&r1=315943&r2=315944&view=diff
==============================================================================
--- llvm/trunk/lib/IR/LLVMContext.cpp (original)
+++ llvm/trunk/lib/IR/LLVMContext.cpp Mon Oct 16 15:22:11 2017
@@ -59,6 +59,7 @@ LLVMContext::LLVMContext() : pImpl(new L
{MD_section_prefix, "section_prefix"},
{MD_absolute_symbol, "absolute_symbol"},
{MD_associated, "associated"},
+ {MD_callees, "callees"},
};
for (auto &MDKind : MDKinds) {
Modified: llvm/trunk/lib/IR/MDBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/MDBuilder.cpp?rev=315944&r1=315943&r2=315944&view=diff
==============================================================================
--- llvm/trunk/lib/IR/MDBuilder.cpp (original)
+++ llvm/trunk/lib/IR/MDBuilder.cpp Mon Oct 16 15:22:11 2017
@@ -14,6 +14,7 @@
#include "llvm/IR/MDBuilder.h"
#include "llvm/IR/Constants.h"
+#include "llvm/IR/Function.h"
#include "llvm/IR/Metadata.h"
using namespace llvm;
@@ -95,6 +96,13 @@ MDNode *MDBuilder::createRange(Constant
return MDNode::get(Context, {createConstant(Lo), createConstant(Hi)});
}
+MDNode *MDBuilder::createCallees(ArrayRef<Function *> Callees) {
+ SmallVector<Metadata *, 4> Ops;
+ for (Function *F : Callees)
+ Ops.push_back(createConstant(F));
+ return MDNode::get(Context, Ops);
+}
+
MDNode *MDBuilder::createAnonymousAARoot(StringRef Name, MDNode *Extra) {
// To ensure uniqueness the root node is self-referential.
auto Dummy = MDNode::getTemporary(Context, None);
Modified: llvm/trunk/test/ThinLTO/X86/lazyload_metadata.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/lazyload_metadata.ll?rev=315944&r1=315943&r2=315944&view=diff
==============================================================================
--- llvm/trunk/test/ThinLTO/X86/lazyload_metadata.ll (original)
+++ llvm/trunk/test/ThinLTO/X86/lazyload_metadata.ll Mon Oct 16 15:22:11 2017
@@ -10,13 +10,13 @@
; RUN: llvm-lto -thinlto-action=import %t2.bc -thinlto-index=%t3.bc \
; RUN: -o /dev/null -stats \
; RUN: 2>&1 | FileCheck %s -check-prefix=LAZY
-; LAZY: 51 bitcode-reader - Number of Metadata records loaded
+; LAZY: 53 bitcode-reader - Number of Metadata records loaded
; LAZY: 2 bitcode-reader - Number of MDStrings loaded
; RUN: llvm-lto -thinlto-action=import %t2.bc -thinlto-index=%t3.bc \
; RUN: -o /dev/null -disable-ondemand-mds-loading -stats \
; RUN: 2>&1 | FileCheck %s -check-prefix=NOTLAZY
-; NOTLAZY: 60 bitcode-reader - Number of Metadata records loaded
+; NOTLAZY: 62 bitcode-reader - Number of Metadata records loaded
; NOTLAZY: 7 bitcode-reader - Number of MDStrings loaded
More information about the llvm-commits
mailing list