LLInt put_by_id uses the wrong load instruction for loading flags from the metadata
authortzagallo@apple.com <tzagallo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 8 Jan 2019 18:29:44 +0000 (18:29 +0000)
committertzagallo@apple.com <tzagallo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 8 Jan 2019 18:29:44 +0000 (18:29 +0000)
https://bugs.webkit.org/show_bug.cgi?id=193221

Reviewed by Mark Lam.

JSTests:

* stress/put-by-id-flags.js: Added.
(f):
(g):
(numberOfDFGCompiles):

Source/JavaScriptCore:

The flags are only 4 bytes, but were loaded with loadp. It used to work,
since the flags were followed by a 4-byte padding, but it broke after the
struct was compacted in r239626.

* llint/LowLevelInterpreter64.asm:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@239731 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JSTests/ChangeLog
JSTests/stress/put-by-id-flags.js [new file with mode: 0644]
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/llint/LowLevelInterpreter64.asm

index 12c1b78..4620538 100644 (file)
@@ -1,3 +1,15 @@
+2019-01-08  Tadeu Zagallo  <tzagallo@apple.com>
+
+        LLInt put_by_id uses the wrong load instruction for loading flags from the metadata
+        https://bugs.webkit.org/show_bug.cgi?id=193221
+
+        Reviewed by Mark Lam.
+
+        * stress/put-by-id-flags.js: Added.
+        (f):
+        (g):
+        (numberOfDFGCompiles):
+
 2019-01-04  Tadeu Zagallo  <tzagallo@apple.com>
 
         Baseline version of get_by_id may corrupt metadata
diff --git a/JSTests/stress/put-by-id-flags.js b/JSTests/stress/put-by-id-flags.js
new file mode 100644 (file)
index 0000000..f67fe16
--- /dev/null
@@ -0,0 +1,23 @@
+function f(x, y) {
+    x.y = y;
+};
+
+function g(x) {
+    return x.y + 42;
+}
+noInline(f);
+noInline(g);
+
+var x = {};
+var y = {};
+f(x, 42);
+f(y, {});
+
+while (!numberOfDFGCompiles(g)) {
+    optimizeNextInvocation(g);
+    if (typeof g(x) !== 'number')
+        throw 'failed warming up';
+}
+
+if (typeof g(y) !== 'string')
+    throw 'failed after compilation';
index 3063c6d..a20b0b1 100644 (file)
@@ -1,3 +1,16 @@
+2019-01-08  Tadeu Zagallo  <tzagallo@apple.com>
+
+        LLInt put_by_id uses the wrong load instruction for loading flags from the metadata
+        https://bugs.webkit.org/show_bug.cgi?id=193221
+
+        Reviewed by Mark Lam.
+
+        The flags are only 4 bytes, but were loaded with loadp. It used to work,
+        since the flags were followed by a 4-byte padding, but it broke after the
+        struct was compacted in r239626.
+
+        * llint/LowLevelInterpreter64.asm:
+
 2019-01-07  Devin Rousso  <drousso@apple.com>
 
         Web Inspector: extend XHR breakpoints to work with fetch
index 2e7ed9e..eed2a0f 100644 (file)
@@ -1341,7 +1341,7 @@ llintOpWithMetadata(op_put_by_id, OpPutById, macro (size, get, dispatch, metadat
     get(value, t1)
     loadConstantOrVariable(size, t1, t3)
 
-    loadp OpPutById::Metadata::flags[t5], t1
+    loadi OpPutById::Metadata::flags[t5], t1
 
     # At this point, we have:
     # t0 -> object base