musttail-invalid.ll 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. ; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s
  2. ; Each musttail call should fail to validate.
  3. declare x86_stdcallcc void @cc_mismatch_callee()
  4. define void @cc_mismatch() {
  5. ; CHECK: mismatched calling conv
  6. musttail call x86_stdcallcc void @cc_mismatch_callee()
  7. ret void
  8. }
  9. declare void @more_parms_callee(i32)
  10. define void @more_parms() {
  11. ; CHECK: mismatched parameter counts
  12. musttail call void @more_parms_callee(i32 0)
  13. ret void
  14. }
  15. declare void @mismatched_intty_callee(i8)
  16. define void @mismatched_intty(i32) {
  17. ; CHECK: mismatched parameter types
  18. musttail call void @mismatched_intty_callee(i8 0)
  19. ret void
  20. }
  21. declare void @mismatched_vararg_callee(i8*, ...)
  22. define void @mismatched_vararg(i8*) {
  23. ; CHECK: mismatched varargs
  24. musttail call void (i8*, ...) @mismatched_vararg_callee(i8* null)
  25. ret void
  26. }
  27. ; We would make this an implicit sret parameter, which would disturb the
  28. ; tail call.
  29. declare { i32, i32, i32 } @mismatched_retty_callee(i32)
  30. define void @mismatched_retty(i32) {
  31. ; CHECK: mismatched return types
  32. musttail call { i32, i32, i32 } @mismatched_retty_callee(i32 0)
  33. ret void
  34. }
  35. declare void @mismatched_byval_callee({ i32 }*)
  36. define void @mismatched_byval({ i32 }* byval %a) {
  37. ; CHECK: mismatched ABI impacting function attributes
  38. musttail call void @mismatched_byval_callee({ i32 }* %a)
  39. ret void
  40. }
  41. declare void @mismatched_inreg_callee(i32 inreg)
  42. define void @mismatched_inreg(i32 %a) {
  43. ; CHECK: mismatched ABI impacting function attributes
  44. musttail call void @mismatched_inreg_callee(i32 inreg %a)
  45. ret void
  46. }
  47. declare void @mismatched_sret_callee(i32* sret)
  48. define void @mismatched_sret(i32* %a) {
  49. ; CHECK: mismatched ABI impacting function attributes
  50. musttail call void @mismatched_sret_callee(i32* sret %a)
  51. ret void
  52. }
  53. declare void @mismatched_alignment_callee(i32* byval align 8)
  54. define void @mismatched_alignment(i32* byval align 4 %a) {
  55. ; CHECK: mismatched ABI impacting function attributes
  56. musttail call void @mismatched_alignment_callee(i32* byval align 8 %a)
  57. ret void
  58. }
  59. declare i32 @not_tail_pos_callee()
  60. define i32 @not_tail_pos() {
  61. ; CHECK: musttail call must be precede a ret with an optional bitcast
  62. %v = musttail call i32 @not_tail_pos_callee()
  63. %w = add i32 %v, 1
  64. ret i32 %w
  65. }
  66. define void @inline_asm() {
  67. ; CHECK: cannot use musttail call with inline asm
  68. musttail call void asm "ret", ""()
  69. ret void
  70. }