anticipated_expressions.sol 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. // RUN: --target solana --emit cfg
  2. contract Test {
  3. // BEGIN-CHECK: Test::Test::function::test1__int256_int256
  4. function test1(int a, int b) pure public returns (int) {
  5. // CHECK: ty:int256 %1.cse_temp = ((arg #0) + (arg #1))
  6. // CHECK: ty:int256 %x = %1.cse_temp
  7. // CHECK: ty:int256 %3.cse_temp = ((arg #0) - (arg #1))
  8. // CHECK: ty:int256 %z = %3.cse_temp
  9. int x = a + b;
  10. int z = a-b;
  11. int p=0;
  12. // CHECK: block1: # cond
  13. // CHECK: ty:int256 %2.cse_temp = (signed modulo (arg #0) % (arg #1))
  14. while(x != 0) {
  15. // CHECK: block2: # body
  16. // CHECK: ty:int256 %z = (%z + int256 9)
  17. // CHECK: ty:int256 %y = %1.cse_temp
  18. // CHECK: ty:int256 %x = (%x - %1.cse_temp)
  19. z+=9;
  20. int y = a + b;
  21. x -= y;
  22. // CHECK: block3: # endwhile
  23. // CHECK: ty:int256 %p2 = %2.cse_temp
  24. // CHECK: return ((((%x + int256 9) - %z) + %p) - (int256 2 * %2.cse_temp))
  25. if (x == 9) {
  26. // CHECK: block4: # then
  27. // CHECK: ty:int256 %y = %3.cse_temp
  28. // CHECK: ty:int256 %p = %2.cse_temp
  29. // CHECK: ty:int256 %x = (%x + %3.cse_temp)
  30. y = a - b;
  31. p = a % b;
  32. x += y;
  33. }
  34. }
  35. int p2 = a%b;
  36. return x+9-z + p - 2*p2;
  37. }
  38. // BEGIN-CHECK: Test::Test::function::test2__int256_int256
  39. function test2(int a, int b) public pure returns (int) {
  40. int y = a-b;
  41. int j=0;
  42. int k=0;
  43. int l=0;
  44. int m=0;
  45. // CHECK: ty:int256 %1.cse_temp = ((arg #0) + (arg #1))
  46. if(y == 5) {
  47. // CHECK: block1: # then
  48. // CHECK: ty:int256 %j = %1.cse_temp
  49. j = a+b;
  50. // CHECK: block3: # endif
  51. // CHECK: ty:int256 %n = %1.cse_temp
  52. // CHECK: return ((((%j + %k) + %l) + %m) + %1.cse_temp)
  53. } else if (y == 2) {
  54. // CHECK: block4: # then
  55. // CHECK: ty:int256 %k = %1.cse_temp
  56. k = a+b;
  57. } else if (y == 3) {
  58. // CHECK: block7: # then
  59. // CHECK: ty:int256 %l = %1.cse_temp
  60. l = a+b;
  61. } else {
  62. // CHECK: block8: # else
  63. // CHECK: ty:int256 %m = %1.cse_temp
  64. m = a+b;
  65. }
  66. int n = a+b;
  67. return j+k+l+m+n;
  68. }
  69. // BEGIN-CHECK: Test::Test::function::test3__int256_int256
  70. function test3(int a, int b) public pure returns (int) {
  71. int y = a-b;
  72. int j=0;
  73. int k=0;
  74. int l=0;
  75. int m=0;
  76. // NOT-CHECK: ty:int256 %1.cse_temp
  77. if(y == 5) {
  78. // CHECK: block1: # then
  79. // CHECK: ty:int256 %j = ((arg #0) + (arg #1))
  80. j = a+b;
  81. // CHECK: block3: # endif
  82. // CHECK: ty:int256 %n = (%a + (arg #1))
  83. // CHECK: return ((((%j + %k) + %l) + %m) + %n)
  84. } else if (y == 2) {
  85. // CHECK: block4: # then
  86. // CHECK: ty:int256 %a = int256 9
  87. // CHECK: ty:int256 %k = (int256 9 + (arg #1))
  88. a = 9;
  89. k = a+b;
  90. } else if (y == 3) {
  91. // CHECK: block7: # then
  92. // CHECK: ty:int256 %l = ((arg #0) + (arg #1))
  93. l = a+b;
  94. } else {
  95. // CHECK: block8: # else
  96. // CHECK: ty:int256 %m = ((arg #0) + (arg #1))
  97. m = a+b;
  98. }
  99. int n = a+b;
  100. return j+k+l+m+n;
  101. }
  102. // BEGIN-CHECK: Test::Test::function::test4__int256_int256
  103. function test4(int a, int b) public pure returns (int) {
  104. int y = a-b;
  105. int j=0;
  106. int k=0;
  107. int l=0;
  108. int m=0;
  109. // CHECK: ty:int256 %1.cse_temp = (unchecked (arg #0) * (arg #1))
  110. // CHECK: block1: # end_switch
  111. // CHECK: ty:int256 %m = %1.cse_temp
  112. // CHECK: return (%l + %1.cse_temp)
  113. assembly {
  114. switch y
  115. case 1 {
  116. // CHECK: block2: # case_0
  117. // CHECK: ty:int256 %j = %1.cse_temp
  118. j := mul(a, b)
  119. }
  120. case 2 {
  121. // CHECK: block3: # case_1
  122. // CHECK: ty:int256 %k = %1.cse_temp
  123. k := mul(a, b)
  124. }
  125. default {
  126. // CHECK: block4: # default
  127. // CHECK: ty:int256 %l = %1.cse_temp
  128. l := mul(a, b)
  129. }
  130. }
  131. unchecked {
  132. m = a*b;
  133. }
  134. return l+m;
  135. }
  136. }