memop_alias.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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. // Compares the value set by interpreter with the jitted code
  6. // need to run with -mic:1 -off:simplejit -off:jitloopbody
  7. // Run locally with -trace:memop -trace:bailout to help find bugs
  8. let size = 200;
  9. let testError = Symbol();
  10. let src = new Array(size);
  11. for(let i = 0; i < size; ++i) {
  12. src[i] = i;
  13. }
  14. function crashBug1(a, b) {
  15. // This should obivously not trigger a memset
  16. for(let i = 0; i < size; ++i) {
  17. let c = [b[i]];
  18. c[i] = 9;
  19. }
  20. try {
  21. for(let i = 0; i < size; ++i) {
  22. let c = b[i] && undefined;
  23. c[i] = 9;
  24. }
  25. return testError;
  26. } catch(e) {
  27. // If everything goes well the above should throw
  28. }
  29. }
  30. function test2(a) {
  31. let c = new Array(size);
  32. for(let i = 0; i < size; ++i) {
  33. a[i] = src[i];
  34. c[i] = a[i];
  35. }
  36. }
  37. function invalidMemset(a, b) {
  38. // if a and b are the same, a[i]=0 will get hoisted and the result will be incorrect
  39. for(let i = 0; i < size; ++i) {
  40. b[i] = i;
  41. a[i] = 0;
  42. }
  43. }
  44. function memopOrder(a, b) {
  45. // In case of aliasing, these 2 memset must remains in this order
  46. // Check the order of memopOrder
  47. for(let i = 0; i < size; ++i) {
  48. b[i] = 4;
  49. a[i] = 5;
  50. }
  51. }
  52. function memsetUnroll(a, b) {
  53. // Check the order of memopOrder
  54. for(let i = 0; i < size; ++i) {
  55. b[i] = 4;
  56. a[i] = 5;
  57. ++i;
  58. a[i] = 5;
  59. b[i] = 4;
  60. }
  61. }
  62. function invalidMemcopy(a, b) {
  63. for(let i = 0; i < size; ++i) {
  64. b[i] = i;
  65. a[i] = b[i];
  66. }
  67. }
  68. function copySetMix1(a, b) {
  69. for(let i = 0; i < size; ++i) {
  70. b[i] = 5;
  71. a[i] = b[i];
  72. }
  73. }
  74. function copySetMix2(a, b) {
  75. for(let i = 0; i < size; ++i) {
  76. a[i] = b[i];
  77. b[i] = 5;
  78. }
  79. }
  80. function copySetMix3(a, b) {
  81. for(let i = 0; i < size; ++i) {
  82. b[i] = a[i];
  83. b[i] = 5;
  84. }
  85. }
  86. function copySetMix4(a, b) {
  87. for(let i = 0; i < size; ++i) {
  88. a[i] = 5;
  89. a[i] = b[i];
  90. }
  91. }
  92. function test(fn) {
  93. let name = fn.name;
  94. let interpretArray = new Array(size);
  95. interpretArray.fill(1);
  96. fn(interpretArray, interpretArray);
  97. let jitArray = new Array(size);
  98. jitArray.fill(1);
  99. let r = fn(jitArray, jitArray);
  100. if(r === testError) {
  101. print(`Error: ${name} had an internal error`);
  102. return false;
  103. }
  104. return compare(interpretArray, jitArray, name);
  105. }
  106. function compare(a, b, name) {
  107. for(let i = 0; i < size; ++i) {
  108. if(a[i] !== b[i]) {
  109. print(`Error: ${name} interpret[${i}] (${a[i]}) !== jit[${i}] (${b[i]})`);
  110. return false;
  111. }
  112. }
  113. return true;
  114. }
  115. let tests = [
  116. crashBug1, // fix then reactivate
  117. test2,
  118. memsetUnroll,
  119. memopOrder,
  120. invalidMemset,
  121. invalidMemcopy,
  122. copySetMix1,
  123. copySetMix2,
  124. copySetMix3,
  125. copySetMix4
  126. ];
  127. let passed = true;
  128. for(let testFn of tests) {
  129. passed &= test(testFn);
  130. }
  131. if(passed) {
  132. print("PASSED");
  133. } else {
  134. print("FAILED");
  135. }