CSE DataViewGet* DFG nodes
https://bugs.webkit.org/show_bug.cgi?id=188768
Reviewed by Yusuke Suzuki.
JSTests:
* microbenchmarks/dataview-cse.js: Added.
(assert):
(test):
* stress/dataview-get-cse.js: Added.
(assert):
(test1.foo):
(test1):
(test2.foo):
(test2):
(test3.foo):
(test3):
(test4.foo):
(test4):
(test5.foo):
(test5):
(test6.foo):
(test6):
Source/JavaScriptCore:
This patch makes it so that we CSE DataViewGet* accesses. To do this,
I needed to add a third descriptor to HeapLocation to represent the
isLittleEndian child. This patch is neutral on compile time benchmarks,
and is a 50% speedup on a trivial CSE microbenchmark that I added.
* dfg/DFGClobberize.h:
(JSC::DFG::clobberize):
* dfg/DFGFixupPhase.cpp:
(JSC::DFG::FixupPhase::fixupNode):
* dfg/DFGHeapLocation.cpp:
(WTF::printInternal):
* dfg/DFGHeapLocation.h:
(JSC::DFG::HeapLocation::HeapLocation):
(JSC::DFG::HeapLocation::hash const):
(JSC::DFG::HeapLocation::operator== const):
(JSC::DFG::indexedPropertyLocForResultType):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@235515 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JSTests/stress/dataview-get-cse.js b/JSTests/stress/dataview-get-cse.js
new file mode 100644
index 0000000..e3d47a9
--- /dev/null
+++ b/JSTests/stress/dataview-get-cse.js
@@ -0,0 +1,137 @@
+"use strict";
+
+function assert(b) {
+ if (!b)
+ throw new Error;
+}
+
+
+function test1() {
+ function foo(dv) {
+ return [dv.getFloat32(0), dv.getFloat64(0)];
+ }
+ noInline(foo);
+
+ let ab = new ArrayBuffer(8);
+ let dv = new DataView(ab);
+ dv.setFloat64(0, 128431.42342189432, false);
+ for (let i = 0; i < 10000; ++i) {
+ let result = foo(dv);
+ assert(result[0] !== result[1]);
+ }
+}
+test1();
+
+function test2() {
+ function foo(dv) {
+ return [dv.getFloat32(0), dv.getFloat32(0)];
+ }
+ noInline(foo);
+
+ let ab = new ArrayBuffer(8);
+ let dv = new DataView(ab);
+ dv.setFloat64(0, 128431.42342189432, false);
+ for (let i = 0; i < 10000; ++i) {
+ let result = foo(dv);
+ assert(result[0] === result[1]);
+ }
+}
+test2();
+
+function test3() {
+ function foo(dv, ta) {
+ let a = dv.getFloat64(0, true);
+ ta[0] = Math.PI;
+ let b = dv.getFloat64(0, true);
+ return [a, b];
+ }
+ noInline(foo);
+
+ let ab = new ArrayBuffer(8);
+ let dv = new DataView(ab);
+ let ta = new Float64Array(ab);
+ for (let i = 0; i < 40000; ++i) {
+ dv.setFloat64(0, 0.0, true);
+ let result = foo(dv, ta);
+ assert(result[0] === 0.0);
+ assert(result[1] === Math.PI);
+ }
+}
+test3();
+
+function test4() {
+ function foo(dv) {
+ let a = dv.getInt32(0, true);
+ let b = dv.getInt32(0, false);
+ return [a, b];
+ }
+ noInline(foo);
+
+ let ab = new ArrayBuffer(8);
+ let dv = new DataView(ab);
+ dv.setInt32(0, 0x11223344, true);
+ for (let i = 0; i < 40000; ++i) {
+ let result = foo(dv);
+ assert(result[0] === 0x11223344);
+ assert(result[1] === 0x44332211)
+ }
+}
+test4();
+
+function test5() {
+ function foo(dv, littleEndian) {
+ let a = dv.getInt32(0, littleEndian);
+ let b = dv.getInt32(0, !littleEndian);
+ return [a, b];
+ }
+ noInline(foo);
+
+ let ab = new ArrayBuffer(8);
+ let dv = new DataView(ab);
+ dv.setInt32(0, 0x11223344, true);
+ for (let i = 0; i < 40000; ++i) {
+ let result = foo(dv, true);
+ assert(result[0] === 0x11223344);
+ assert(result[1] === 0x44332211)
+ }
+}
+test5();
+
+function test6() {
+ function foo(dv, littleEndian) {
+ let a = dv.getInt32(0, littleEndian);
+ let b = dv.getInt32(0, littleEndian);
+ return [a, b];
+ }
+ noInline(foo);
+
+ let ab = new ArrayBuffer(8);
+ let dv = new DataView(ab);
+ dv.setInt32(0, 0x11223344, true);
+ for (let i = 0; i < 40000; ++i) {
+ let result = foo(dv, true);
+ assert(result[0] === 0x11223344);
+ assert(result[1] === 0x11223344)
+ }
+}
+test6();
+
+function test7() {
+ function foo(dv) {
+ let a = dv.getInt32(0, true);
+ let b = dv.getInt32(4, true);
+ return [a, b];
+ }
+ noInline(foo);
+
+ let ab = new ArrayBuffer(8);
+ let dv = new DataView(ab);
+ dv.setInt32(0, 0x11223344, true);
+ dv.setInt32(4, 0x12121212, true);
+ for (let i = 0; i < 40000; ++i) {
+ let result = foo(dv, true);
+ assert(result[0] === 0x11223344);
+ assert(result[1] === 0x12121212);
+ }
+}
+test7();