1*8b360c69SBin Cheng; RUN: opt -function-specialization -force-function-specialization -S < %s | FileCheck %s
2*8b360c69SBin Cheng
3*8b360c69SBin Cheng; Check that we don't crash and specialise on a function call with byval attribute.
4*8b360c69SBin Cheng
5*8b360c69SBin Cheng; CHECK-NOT: wombat.{{[0-9]+}}
6*8b360c69SBin Cheng
7*8b360c69SBin Chengdeclare i32* @quux()
8*8b360c69SBin Chengdeclare i32* @eggs()
9*8b360c69SBin Cheng
10*8b360c69SBin Chengdefine i32 @main() {
11*8b360c69SBin Cheng; CHECK:       bb:
12*8b360c69SBin Cheng; CHECK-NEXT:    tail call void @wombat(i8* undef, i64 undef, i64 undef, i32* byval(i32) bitcast (i32* ()* @quux to i32*))
13*8b360c69SBin Cheng; CHECK-NEXT:    tail call void @wombat(i8* undef, i64 undef, i64 undef, i32* byval(i32) bitcast (i32* ()* @eggs to i32*))
14*8b360c69SBin Cheng; CHECK-NEXT:    ret i32 undef
15*8b360c69SBin Cheng;
16*8b360c69SBin Chengbb:
17*8b360c69SBin Cheng  tail call void @wombat(i8* undef, i64 undef, i64 undef, i32* byval(i32) bitcast (i32* ()* @quux to i32*))
18*8b360c69SBin Cheng  tail call void @wombat(i8* undef, i64 undef, i64 undef, i32* byval(i32) bitcast (i32* ()* @eggs to i32*))
19*8b360c69SBin Cheng  ret i32 undef
20*8b360c69SBin Cheng}
21*8b360c69SBin Cheng
22*8b360c69SBin Chengdefine internal void @wombat(i8* %arg, i64 %arg1, i64 %arg2, i32* byval(i32) %func) {
23*8b360c69SBin Cheng; CHECK:       bb2:
24*8b360c69SBin Cheng; CHECK-NEXT:    [[FUNPTR:%.*]] = bitcast i32* %func to i32* (i8*, i8*)*
25*8b360c69SBin Cheng; CHECK-NEXT:    [[TMP:%.*]] = tail call i32* [[FUNPTR]](i8* undef, i8* undef)
26*8b360c69SBin Cheng; CHECK-NEXT:    ret void
27*8b360c69SBin Cheng;
28*8b360c69SBin Chengbb2:
29*8b360c69SBin Cheng  %mycall = bitcast i32* %func to i32* (i8*, i8*)*
30*8b360c69SBin Cheng  %tmp = tail call i32* %mycall(i8* undef, i8* undef)
31*8b360c69SBin Cheng  ret void
32*8b360c69SBin Cheng}
33