Title: [192478] trunk/Source/_javascript_Core
Revision
192478
Author
fpi...@apple.com
Date
2015-11-16 11:29:34 -0800 (Mon, 16 Nov 2015)

Log Message

Make sure that the address matcher correctly handles Shl(x, 1)
https://bugs.webkit.org/show_bug.cgi?id=151316

Reviewed by Geoffrey Garen.

This optimization isn't really that awesome, but the nicest part of the change is just the
testing. If we ever do more cleverness with shifts, these tests will come in handy.

* b3/B3LowerToAir.cpp:
(JSC::B3::Air::LowerToAir::effectiveAddr):
* b3/testb3.cpp:
(JSC::B3::testLoadOffsetUsingAddNotConstant):
(JSC::B3::testLoadAddrShift):
(JSC::B3::testFramePointer):
(JSC::B3::run):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (192477 => 192478)


--- trunk/Source/_javascript_Core/ChangeLog	2015-11-16 19:04:02 UTC (rev 192477)
+++ trunk/Source/_javascript_Core/ChangeLog	2015-11-16 19:29:34 UTC (rev 192478)
@@ -1,3 +1,21 @@
+2015-11-16  Filip Pizlo  <fpi...@apple.com>
+
+        Make sure that the address matcher correctly handles Shl(x, 1)
+        https://bugs.webkit.org/show_bug.cgi?id=151316
+
+        Reviewed by Geoffrey Garen.
+
+        This optimization isn't really that awesome, but the nicest part of the change is just the
+        testing. If we ever do more cleverness with shifts, these tests will come in handy.
+
+        * b3/B3LowerToAir.cpp:
+        (JSC::B3::Air::LowerToAir::effectiveAddr):
+        * b3/testb3.cpp:
+        (JSC::B3::testLoadOffsetUsingAddNotConstant):
+        (JSC::B3::testLoadAddrShift):
+        (JSC::B3::testFramePointer):
+        (JSC::B3::run):
+
 2015-11-16  Carlos Garcia Campos  <cgar...@igalia.com>
 
         [GTK] Use FTL by default when LLVM 3.7 is available

Modified: trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp (192477 => 192478)


--- trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp	2015-11-16 19:04:02 UTC (rev 192477)
+++ trunk/Source/_javascript_Core/b3/B3LowerToAir.cpp	2015-11-16 19:29:34 UTC (rev 192478)
@@ -395,6 +395,18 @@
             return Arg::index(tmp(left), tmp(right));
         }
 
+        case Shl: {
+            Value* left = address->child(0);
+
+            // We'll never see child(1)->isInt32(0), since that would have been reduced. If the shift
+            // amount is greater than 1, then there isn't really anything smart that we could do here.
+            // We avoid using baseless indexes because their encoding isn't particularly efficient.
+            if (m_locked.contains(left) || !address->child(1)->isInt32(1))
+                return Arg::addr(tmp(address));
+
+            return Arg::index(tmp(left), tmp(left));
+        }
+
         case FramePointer:
             return Arg::addr(Tmp(GPRInfo::callFrameRegister));
 

Modified: trunk/Source/_javascript_Core/b3/testb3.cpp (192477 => 192478)


--- trunk/Source/_javascript_Core/b3/testb3.cpp	2015-11-16 19:04:02 UTC (rev 192477)
+++ trunk/Source/_javascript_Core/b3/testb3.cpp	2015-11-16 19:29:34 UTC (rev 192478)
@@ -1889,6 +1889,36 @@
     CHECK(compileAndRun<int>(proc, &array[0]) == array[0] + array[1]);
 }
 
+void testLoadAddrShift(unsigned shift)
+{
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    int slots[2];
+
+    // Figure out which slot to use while having proper alignment for the shift.
+    int* slot;
+    uintptr_t arg;
+    for (unsigned i = sizeof(slots)/sizeof(slots[0]); i--;) {
+        slot = slots + i;
+        arg = bitwise_cast<uintptr_t>(slot) >> shift;
+        if (bitwise_cast<int*>(arg << shift) == slot)
+            break;
+    }
+
+    *slot = 8675309;
+    
+    root->appendNew<ControlValue>(
+        proc, Return, Origin(),
+        root->appendNew<MemoryValue>(
+            proc, Load, Int32, Origin(),
+            root->appendNew<Value>(
+                proc, Shl, Origin(),
+                root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0),
+                root->appendNew<Const32Value>(proc, Origin(), shift))));
+
+    CHECK(compileAndRun<int>(proc, arg) == 8675309);
+}
+
 void testFramePointer()
 {
     Procedure proc;
@@ -4362,6 +4392,10 @@
     RUN(testLoadOffsetUsingAdd());
     RUN(testLoadOffsetUsingAddInterference());
     RUN(testLoadOffsetUsingAddNotConstant());
+    RUN(testLoadAddrShift(0));
+    RUN(testLoadAddrShift(1));
+    RUN(testLoadAddrShift(2));
+    RUN(testLoadAddrShift(3));
     RUN(testFramePointer());
     RUN(testStackSlot());
     RUN(testLoadFromFramePointer());
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to