From fe45fd084db872f9c7106c26e52c1cc8c9cba3a5 Mon Sep 17 00:00:00 2001 From: Paul Robinson Date: Mon, 18 Nov 2013 21:44:03 +0000 Subject: The 'optnone' attribute means don't inline anything into this function (except functions marked always_inline). Functions with 'optnone' must also have 'noinline' so they don't get inlined into any other function. Based on work by Andrea Di Biagio. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@195046 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Transforms/Inline/inline-optnone.ll | 52 ++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 test/Transforms/Inline/inline-optnone.ll (limited to 'test/Transforms') diff --git a/test/Transforms/Inline/inline-optnone.ll b/test/Transforms/Inline/inline-optnone.ll new file mode 100644 index 0000000..9b99c45 --- /dev/null +++ b/test/Transforms/Inline/inline-optnone.ll @@ -0,0 +1,52 @@ +; RUN: opt < %s -inline -S | FileCheck %s + +; Test that functions with attribute optnone are not inlined. +; Also test that only functions with attribute alwaysinline are +; valid candidates for inlining if the caller has the optnone attribute. + +; Function Attrs: alwaysinline nounwind readnone uwtable +define i32 @alwaysInlineFunction(i32 %a) #0 { +entry: + %mul = mul i32 %a, %a + ret i32 %mul +} + +; Function Attrs: nounwind readnone uwtable +define i32 @simpleFunction(i32 %a) #1 { +entry: + %add = add i32 %a, %a + ret i32 %add +} + +; Function Attrs: nounwind noinline optnone readnone uwtable +define i32 @OptnoneFunction(i32 %a) #2 { +entry: + %0 = tail call i32 @alwaysInlineFunction(i32 %a) + %1 = tail call i32 @simpleFunction(i32 %a) + %add = add i32 %0, %1 + ret i32 %add +} + +; CHECK-LABEL: @OptnoneFunction +; CHECK-NOT: call i32 @alwaysInlineFunction(i32 %a) +; CHECK: call i32 @simpleFunction(i32 %a) +; CHECK: ret + +; Function Attrs: nounwind readnone uwtable +define i32 @bar(i32 %a) #1 { +entry: + %0 = tail call i32 @OptnoneFunction(i32 5) + %1 = tail call i32 @simpleFunction(i32 6) + %add = add i32 %0, %1 + ret i32 %add +} + +; CHECK-LABEL: @bar +; CHECK: call i32 @OptnoneFunction(i32 5) +; CHECK-NOT: call i32 @simpleFunction(i32 6) +; CHECK: ret + + +attributes #0 = { alwaysinline nounwind readnone uwtable } +attributes #1 = { nounwind readnone uwtable } +attributes #2 = { nounwind noinline optnone readnone uwtable } -- cgit v1.1