1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -inline -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Test that functions with attribute optnone are not inlined. 4*9880d681SAndroid Build Coastguard Worker; Also test that only functions with attribute alwaysinline are 5*9880d681SAndroid Build Coastguard Worker; valid candidates for inlining if the caller has the optnone attribute. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; Function Attrs: alwaysinline nounwind readnone uwtable 8*9880d681SAndroid Build Coastguard Workerdefine i32 @alwaysInlineFunction(i32 %a) #0 { 9*9880d681SAndroid Build Coastguard Workerentry: 10*9880d681SAndroid Build Coastguard Worker %mul = mul i32 %a, %a 11*9880d681SAndroid Build Coastguard Worker ret i32 %mul 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone uwtable 15*9880d681SAndroid Build Coastguard Workerdefine i32 @simpleFunction(i32 %a) #1 { 16*9880d681SAndroid Build Coastguard Workerentry: 17*9880d681SAndroid Build Coastguard Worker %add = add i32 %a, %a 18*9880d681SAndroid Build Coastguard Worker ret i32 %add 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind noinline optnone readnone uwtable 22*9880d681SAndroid Build Coastguard Workerdefine i32 @OptnoneFunction(i32 %a) #2 { 23*9880d681SAndroid Build Coastguard Workerentry: 24*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @alwaysInlineFunction(i32 %a) 25*9880d681SAndroid Build Coastguard Worker %1 = tail call i32 @simpleFunction(i32 %a) 26*9880d681SAndroid Build Coastguard Worker %add = add i32 %0, %1 27*9880d681SAndroid Build Coastguard Worker ret i32 %add 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @OptnoneFunction 31*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call i32 @alwaysInlineFunction(i32 %a) 32*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @simpleFunction(i32 %a) 33*9880d681SAndroid Build Coastguard Worker; CHECK: ret 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone uwtable 36*9880d681SAndroid Build Coastguard Workerdefine i32 @bar(i32 %a) #1 { 37*9880d681SAndroid Build Coastguard Workerentry: 38*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @OptnoneFunction(i32 5) 39*9880d681SAndroid Build Coastguard Worker %1 = tail call i32 @simpleFunction(i32 6) 40*9880d681SAndroid Build Coastguard Worker %add = add i32 %0, %1 41*9880d681SAndroid Build Coastguard Worker ret i32 %add 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bar 45*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @OptnoneFunction(i32 5) 46*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call i32 @simpleFunction(i32 6) 47*9880d681SAndroid Build Coastguard Worker; CHECK: ret 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerattributes #0 = { alwaysinline nounwind readnone uwtable } 51*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind readnone uwtable } 52*9880d681SAndroid Build Coastguard Workerattributes #2 = { nounwind noinline optnone readnone uwtable } 53