95 lines · plain
1; Test to ensure no inlining is allowed into a caller with fewer nobuiltin attributes.2; RUN: opt < %s -mtriple=x86_64-unknown-linux-gnu -S -passes=inline | FileCheck %s3; RUN: opt < %s -mtriple=x86_64-unknown-linux-gnu -S -passes='cgscc(inline)' | FileCheck %s4 5; Make sure we don't inline callees into a caller with a superset of the6; no builtin attributes when -inline-caller-superset-nobuiltin=false.7; RUN: opt < %s -inline-caller-superset-nobuiltin=false -mtriple=x86_64-unknown-linux-gnu -S -passes='cgscc(inline)' | FileCheck %s --check-prefix=NOSUPERSET8 9target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"10target triple = "x86_64-unknown-linux-gnu"11 12define i32 @allbuiltins() {13entry:14 %call = call i32 (...) @externalfunc()15 ret i32 %call16; CHECK-LABEL: allbuiltins17; CHECK: call i32 (...) @externalfunc()18}19declare i32 @externalfunc(...)20 21; We can inline a function that allows all builtins into one with a single22; nobuiltin.23define i32 @nobuiltinmemcpy() #0 {24entry:25 %call = call i32 @allbuiltins()26 ret i32 %call27; CHECK-LABEL: nobuiltinmemcpy28; CHECK-NOT: call i32 @allbuiltins()29; NOSUPERSET-LABEL: nobuiltinmemcpy30; NOSUPERSET: call i32 @allbuiltins()31}32 33; We can inline a function that allows all builtins into one with all34; nobuiltins.35define i32 @nobuiltins() #1 {36entry:37 %call = call i32 @allbuiltins()38 ret i32 %call39; CHECK-LABEL: nobuiltins40; CHECK-NOT: call i32 @allbuiltins()41; NOSUPERSET-LABEL: nobuiltins42; NOSUPERSET: call i32 @allbuiltins()43}44 45; We can inline a function with a single nobuiltin into one with all nobuiltins.46define i32 @nobuiltins2() #1 {47entry:48 %call = call i32 @nobuiltinmemcpy()49 ret i32 %call50; CHECK-LABEL: nobuiltins251; CHECK-NOT: call i32 @nobuiltinmemcpy()52; NOSUPERSET-LABEL: nobuiltins253; NOSUPERSET: call i32 @nobuiltinmemcpy()54}55 56; We can't inline a function with any given nobuiltin into one that allows all57; builtins.58define i32 @allbuiltins2() {59entry:60 %call = call i32 @nobuiltinmemcpy()61 ret i32 %call62; CHECK-LABEL: allbuiltins263; CHECK: call i32 @nobuiltinmemcpy()64; NOSUPERSET-LABEL: allbuiltins265; NOSUPERSET: call i32 @nobuiltinmemcpy()66}67 68; We can't inline a function with all nobuiltins into one that allows all69; builtins.70define i32 @allbuiltins3() {71entry:72 %call = call i32 @nobuiltins()73 ret i32 %call74; CHECK-LABEL: allbuiltins375; CHECK: call i32 @nobuiltins()76; NOSUPERSET-LABEL: allbuiltins377; NOSUPERSET: call i32 @nobuiltins()78}79 80; We can't inline a function with a specific nobuiltin into one with a81; different specific nobuiltin.82define i32 @nobuiltinmemset() #2 {83entry:84 %call = call i32 @nobuiltinmemcpy()85 ret i32 %call86; CHECK-LABEL: nobuiltinmemset87; CHECK: call i32 @nobuiltinmemcpy()88; NOSUPERSET-LABEL: nobuiltinmemset89; NOSUPERSET: call i32 @nobuiltinmemcpy()90}91 92attributes #0 = { "no-builtin-memcpy" }93attributes #1 = { "no-builtins" }94attributes #2 = { "no-builtin-memset" }95