BoundCheckElimination.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. function testHoistability(unknown_i, unknown_n) {
  6. var sum = 0, a;
  7. a = [1, 2, 3, 4];
  8. for(var i = 0; i < 4; ++i)
  9. sum += a[i];
  10. a = [1, 2, 3, 4];
  11. for(var i = 3; i >= 0; --i)
  12. sum += a[i];
  13. a = [1, 2, 3, 4];
  14. for(var i = 0, j = 0; i < 4; ++i, ++j)
  15. sum += a[j];
  16. a = [1, 2, 3, 4];
  17. for(var i = 3, j = 3; i >= 0; --i, --j)
  18. sum += a[j];
  19. var a = [1, 2, 3, 4];
  20. for(var i = unknown_i; i < unknown_n; ++i)
  21. sum += a[i];
  22. a = [1, 2, 3, 4];
  23. for(var i = unknown_n - 1; i >= unknown_i; --i)
  24. sum += a[i];
  25. a = [1, 2, 3, 4];
  26. for(var i = unknown_i, j = unknown_i; i < unknown_n; ++i, ++j)
  27. sum += a[j];
  28. a = [1, 2, 3, 4];
  29. for(var i = unknown_n - 1, j = unknown_n - 1; i >= unknown_i; --i, --j)
  30. sum += a[j];
  31. return sum;
  32. }
  33. WScript.Echo("testHoistability: " + testHoistability(0, 4));
  34. WScript.Echo("testHoistability: " + testHoistability(0, 4));
  35. WScript.Echo("");
  36. function testUnhoistability(unknown_i, unknown_n) {
  37. var sum = 0, a;
  38. a = [1, 2, 3, 4];
  39. for(var i = -1; i < 4; ++i)
  40. sum += a[i];
  41. a = [1, 2, 3, 4];
  42. for(var i = 3; i >= -1; --i)
  43. sum += a[i];
  44. a = [1, 2, 3, 4];
  45. for(var i = 0; i < 5; ++i)
  46. sum += a[i];
  47. a = [1, 2, 3, 4];
  48. for(var i = 4; i >= 0; --i)
  49. sum += a[i];
  50. a = [1, 2, 3, 4];
  51. for(var i = -1, j = -1; i < 4; ++i, ++j)
  52. sum += a[j];
  53. a = [1, 2, 3, 4];
  54. for(var i = 3, j = 3; i >= -1; --i, --j)
  55. sum += a[j];
  56. a = [1, 2, 3, 4];
  57. for(var i = 0, j = 0; i < 5; ++i, ++j)
  58. sum += a[j];
  59. a = [1, 2, 3, 4];
  60. for(var i = 4, j = 4; i >= 0; --i, --j)
  61. sum += a[j];
  62. var a = [1, 2, 3, 4];
  63. for(var i = unknown_i - 1; i < unknown_n; ++i)
  64. sum += a[i];
  65. a = [1, 2, 3, 4];
  66. for(var i = unknown_n - 1; i >= unknown_i - 1; --i)
  67. sum += a[i];
  68. var a = [1, 2, 3, 4];
  69. for(var i = unknown_i; i <= unknown_n; ++i)
  70. sum += a[i];
  71. a = [1, 2, 3, 4];
  72. for(var i = unknown_n; i >= unknown_i; --i)
  73. sum += a[i];
  74. a = [1, 2, 3, 4];
  75. for(var i = unknown_i - 1, j = unknown_i - 1; i < unknown_n; ++i, ++j)
  76. sum += a[j];
  77. a = [1, 2, 3, 4];
  78. for(var i = unknown_n - 1, j = unknown_n - 1; i >= unknown_i - 1; --i, --j)
  79. sum += a[j];
  80. a = [1, 2, 3, 4];
  81. for(var i = unknown_i, j = unknown_i; i <= unknown_n; ++i, ++j)
  82. sum += a[j];
  83. a = [1, 2, 3, 4];
  84. for(var i = unknown_n, j = unknown_n; i >= unknown_i; --i, --j)
  85. sum += a[j];
  86. return sum;
  87. }
  88. WScript.Echo("testUnhoistability: " + testUnhoistability(0, 4));
  89. WScript.Echo("testUnhoistability: " + testUnhoistability(0, 4));
  90. WScript.Echo("");
  91. function testInductionVariableWithConstantValue_0(i) {
  92. var a = [1, 2];
  93. var sum = 0;
  94. for(; i == 1; ++i)
  95. sum += a[i];
  96. return sum;
  97. }
  98. WScript.Echo("testInductionVariableWithConstantValue_0: " + testInductionVariableWithConstantValue_0(1));
  99. WScript.Echo("testInductionVariableWithConstantValue_0: " + testInductionVariableWithConstantValue_0(1));
  100. WScript.Echo("");
  101. function testInductionVariableWithConstantValue_1(i) {
  102. var a = [1, 2];
  103. var sum = 0;
  104. for(; i == 1; --i)
  105. sum += a[i];
  106. return sum;
  107. }
  108. WScript.Echo("testInductionVariableWithConstantValue_1: " + testInductionVariableWithConstantValue_1(1));
  109. WScript.Echo("testInductionVariableWithConstantValue_1: " + testInductionVariableWithConstantValue_1(1));
  110. WScript.Echo("");
  111. function testInductionVariableWithConstantValue_2(i) {
  112. var a = [1, 2];
  113. var sum = 0;
  114. for(var j = i; i == 1; ++i, ++j)
  115. sum += a[j];
  116. return sum;
  117. }
  118. WScript.Echo("testInductionVariableWithConstantValue_2: " + testInductionVariableWithConstantValue_2(1));
  119. WScript.Echo("testInductionVariableWithConstantValue_2: " + testInductionVariableWithConstantValue_2(1));
  120. WScript.Echo("");
  121. function testInductionVariableWithConstantValue_3(i) {
  122. var a = [1, 2];
  123. var sum = 0;
  124. for(var j = i; i == 1; --i, --j)
  125. sum += a[j];
  126. return sum;
  127. }
  128. WScript.Echo("testInductionVariableWithConstantValue_3: " + testInductionVariableWithConstantValue_3(1));
  129. WScript.Echo("testInductionVariableWithConstantValue_3: " + testInductionVariableWithConstantValue_3(1));
  130. WScript.Echo("");
  131. (function() {
  132. function testInductionVariableEqualsConstantAndHoistability(a, i, n) {
  133. var sum = 0;
  134. for(; i < n; ++i) {
  135. if(i === 0)
  136. sum = 0;
  137. sum += a[i];
  138. }
  139. return sum;
  140. }
  141. var a = [1, 2];
  142. testInductionVariableEqualsConstantAndHoistability(a, 0, 2);
  143. testInductionVariableEqualsConstantAndHoistability(a, 0, 2);
  144. WScript.Echo("");
  145. })();
  146. (function() {
  147. function testHoistabilityAndCompatibilityAndBoundInfoPropagationOutOfLoop(a, b) {
  148. var sum = 0;
  149. var n = a.length;
  150. for(var i = 0; i < n; ++i) {
  151. if(a[i] === 0) {
  152. ++sum;
  153. break;
  154. }
  155. }
  156. if(b)
  157. a[n] = 0;
  158. return sum;
  159. }
  160. var a = [1, 2];
  161. testHoistabilityAndCompatibilityAndBoundInfoPropagationOutOfLoop(a);
  162. testHoistabilityAndCompatibilityAndBoundInfoPropagationOutOfLoop(a);
  163. WScript.Echo("");
  164. })();