Просмотр исходного кода

fix bug in BrBool peep where cmp2Src==cmp1Dst

Michael Holman 8 лет назад
Родитель
Сommit
ee701cb53b
3 измененных файлов с 42 добавлено и 0 удалено
  1. 4 0
      lib/Backend/PreLowerPeeps.cpp
  2. 33 0
      test/AsmJs/brbool.js
  3. 5 0
      test/AsmJs/rlexe.xml

+ 4 - 0
lib/Backend/PreLowerPeeps.cpp

@@ -362,6 +362,10 @@ IR::Instr *Lowerer::PeepBrBool(IR::Instr *instrBr)
     {
         return instrBr;
     }
+    if (cm1DstReg->IsEqual(instrCm2->GetSrc1()) || cm1DstReg->IsEqual(instrCm2->GetSrc2()))
+    {
+        return instrBr;
+    }
     if (cm1DstReg->IsEqual(instrBinOp->GetSrc1()))
     {
         if (!instrBinOp->GetSrc1()->AsRegOpnd()->GetIsDead())

+ 33 - 0
test/AsmJs/brbool.js

@@ -0,0 +1,33 @@
+//-------------------------------------------------------------------------------------------------------
+// Copyright (C) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
+//-------------------------------------------------------------------------------------------------------
+
+
+let test = (function ()
+{
+    "use asm";
+    function brbool(a, b, c) {
+        a = a|0;
+        b = b|0;
+        c = c|0;
+        var d = 0;
+        var e = 0;
+        d = (a|0) == (b|0);
+        e = (d|0) == (c|0);
+        if((d & e)|0)
+        {
+            return 1;
+        }
+        return 2;
+    }
+    return brbool;
+})()
+if(test(1,1,1) == 1 && test(1,2,3) == 2)
+{
+    print("PASS");
+}
+else
+{
+    print("FAIL");
+}

+ 5 - 0
test/AsmJs/rlexe.xml

@@ -617,6 +617,11 @@
       <files>evalbug.js</files>
     </default>
   </test>
+  <test>
+    <default>
+      <files>brbool.js</files>
+    </default>
+  </test>
   <test>
     <default>
       <files>constTest.js</files>