functions.sol 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // RUN: --target solana --emit cfg -Onone --no-cse
  2. contract testing {
  3. function yul_function() public pure returns (uint256) {
  4. uint256 c;
  5. uint256 d;
  6. assembly {
  7. // BEGIN-CHECK: # function testing::yul_function_0::early_leave public:false selector: nonpayable:true
  8. // CHECK: # params: uint256 a,uint256 b
  9. // CHECK: # returns:
  10. function early_leave(a, b) {
  11. let x := add(a, b)
  12. if lt(x, 2) {
  13. // CHECK: block1: # then
  14. x := sub(a, b)
  15. // CHECK: ty:uint256 %x = (unchecked (arg #0) - (arg #1))
  16. leave
  17. // CHECK: return
  18. }
  19. // CHECK: block2: # endif
  20. // CHECK: ty:uint256 %x = (uint256 2 << (arg #0))
  21. x := shl(a, 2)
  22. // CHECK: return
  23. }
  24. // BEGIN-CHECK: function testing::yul_function_1::single_return public:false selector: nonpayable:true
  25. // CHECK: # params: uint256 a,int32 b
  26. // CHECK: # returns: uint256 ret1
  27. function single_return(a, b : s32) -> ret1 {
  28. if lt(a, 2) {
  29. // CHECK: block1: # then
  30. ret1 := add(sub(a,b), mul(shr(a, 2), 3))
  31. // CHECK: ty:uint256 %ret1 = uint256((unchecked (unchecked int256((arg #0)) - (sext int256 (arg #1))) + int256((unchecked (uint256 2 >> (arg #0)) * uint256 3))))
  32. leave
  33. // CHECK: return %ret1
  34. }
  35. // CHECK: block2: # endif
  36. ret1 := a
  37. // CHECK: ty:uint256 %ret1 = (arg #0)
  38. // CHECK: return (arg #0)
  39. }
  40. // BEGIN-CHECK: function testing::yul_function_2::multiple_returns public:false selector: nonpayable:true
  41. // CHECK: # params: uint256 a,uint256 b
  42. // CHECK: # returns: uint64 ret1,uint256 ret2
  43. function multiple_returns(a, b) -> ret1 : u64, ret2 {
  44. if lt(a, 2) {
  45. // CHECK: block1: # then
  46. ret1 := a
  47. // CHECK: ty:uint64 %ret1 = (trunc uint64 (arg #0))
  48. ret2 := b
  49. // CHECK: ty:uint256 %ret2 = (arg #1)
  50. leave
  51. // CHECK: return (trunc uint64 (arg #0)), (arg #1)
  52. }
  53. // CHECK: ty:uint64 %ret1 = (trunc uint64 (arg #1))
  54. ret1 := b
  55. // CHECK: ty:uint256 %ret2 = (arg #0)
  56. ret2 := a
  57. // CHECK: return (trunc uint64 (arg #1)), (arg #0)
  58. }
  59. c := 1
  60. d := 2
  61. early_leave(c, d)
  62. c := single_return(c, d)
  63. c, d := multiple_returns(c, d)
  64. }
  65. return c+d;
  66. }
  67. }