1; RUN: opt < %s -passes=globalopt -S | FileCheck %s 2 3declare token @llvm.call.preallocated.setup(i32) 4declare i8* @llvm.call.preallocated.arg(token, i32) 5 6define internal i32 @f(i32* %m) { 7; CHECK-LABEL: define internal fastcc i32 @f 8 %v = load i32, i32* %m 9 ret i32 %v 10} 11 12define internal x86_thiscallcc i32 @g(i32* %m) { 13; CHECK-LABEL: define internal fastcc i32 @g 14 %v = load i32, i32* %m 15 ret i32 %v 16} 17 18; Leave this one alone, because the user went out of their way to request this 19; convention. 20define internal coldcc i32 @h(i32* %m) { 21; CHECK-LABEL: define internal coldcc i32 @h 22 %v = load i32, i32* %m 23 ret i32 %v 24} 25 26define internal i32 @j(i32* %m) { 27; CHECK-LABEL: define internal i32 @j 28 %v = load i32, i32* %m 29 ret i32 %v 30} 31 32define internal i32 @inalloca(i32* inalloca(i32) %p) { 33; CHECK-LABEL: define internal fastcc i32 @inalloca(i32* %p) 34 %rv = load i32, i32* %p 35 ret i32 %rv 36} 37 38define i32 @inalloca2_caller(i32* inalloca(i32) %p) { 39 %rv = musttail call i32 @inalloca2(i32* inalloca(i32) %p) 40 ret i32 %rv 41} 42define internal i32 @inalloca2(i32* inalloca(i32) %p) { 43; Because of the musttail caller, this inalloca cannot be dropped. 44; CHECK-LABEL: define internal i32 @inalloca2(i32* inalloca(i32) %p) 45 %rv = load i32, i32* %p 46 ret i32 %rv 47} 48 49define internal i32 @preallocated(i32* preallocated(i32) %p) { 50; CHECK-LABEL: define internal fastcc i32 @preallocated(i32* %p) 51 %rv = load i32, i32* %p 52 ret i32 %rv 53} 54 55define void @call_things() { 56 %m = alloca i32 57 call i32 @f(i32* %m) 58 call x86_thiscallcc i32 @g(i32* %m) 59 call coldcc i32 @h(i32* %m) 60 call i32 @j(i32* %m) 61 %args = alloca inalloca i32 62 call i32 @inalloca(i32* inalloca(i32) %args) 63 %c = call token @llvm.call.preallocated.setup(i32 1) 64 %N = call i8* @llvm.call.preallocated.arg(token %c, i32 0) preallocated(i32) 65 %n = bitcast i8* %N to i32* 66 call i32 @preallocated(i32* preallocated(i32) %n) ["preallocated"(token %c)] 67 ret void 68} 69; CHECK-LABEL: define void @call_things() 70; CHECK: call fastcc i32 @f 71; CHECK: call fastcc i32 @g 72; CHECK: call coldcc i32 @h 73; CHECK: call i32 @j 74; CHECK: call fastcc i32 @inalloca(i32* %args) 75; CHECK-NOT: llvm.call.preallocated 76; CHECK: call fastcc i32 @preallocated(i32* %n) 77 78@llvm.used = appending global [1 x i8*] [ 79 i8* bitcast (i32(i32*)* @j to i8*) 80], section "llvm.metadata" 81