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