From 4935ac688915c934b3d2fcde29c25ae8f0ce7b95 Mon Sep 17 00:00:00 2001 From: Sanjoy Das Date: Fri, 23 Oct 2015 20:09:55 +0000 Subject: [PATCH] [Inliner] Don't inline through callsites with operand bundles Summary: This change teaches the LLVM inliner to not inline through callsites with unknown operand bundles. Currently all operand bundles are "unknown" operand bundles but in the near future we will add support for inlining through some select kinds of operand bundles. Reviewers: reames, chandlerc, majnemer Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D14001 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251141 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/InlineFunction.cpp | 4 ++++ .../OperandBundles/inliner-conservative.ll | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 test/Feature/OperandBundles/inliner-conservative.ll diff --git a/lib/Transforms/Utils/InlineFunction.cpp b/lib/Transforms/Utils/InlineFunction.cpp index 5539a26b3f3..1507d313aa0 100644 --- a/lib/Transforms/Utils/InlineFunction.cpp +++ b/lib/Transforms/Utils/InlineFunction.cpp @@ -1029,6 +1029,10 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI, CalledFunc->isDeclaration() || // call, or call to a vararg function! CalledFunc->getFunctionType()->isVarArg()) return false; + // The inliner does not know how to inline through calls with operand bundles. + if (CS.hasOperandBundles()) + return false; + // If the call to the callee cannot throw, set the 'nounwind' flag on any // calls that we inline. bool MarkNoUnwind = CS.doesNotThrow(); diff --git a/test/Feature/OperandBundles/inliner-conservative.ll b/test/Feature/OperandBundles/inliner-conservative.ll new file mode 100644 index 00000000000..d9f09f71d90 --- /dev/null +++ b/test/Feature/OperandBundles/inliner-conservative.ll @@ -0,0 +1,17 @@ +; RUN: opt -S -inline < %s | FileCheck %s + +; Check that the inliner does not inline through arbitrary unknown +; operand bundles. + +define i32 @callee() { + entry: + ret i32 2 +} + +define i32 @caller() { +; CHECK: @caller( + entry: +; CHECK: call i32 @callee() [ "unknown"() ] + %x = call i32 @callee() [ "unknown"() ] + ret i32 %x +} -- 2.34.1