[JSC] Add a function attribute for Pure functions in B3
authorbenjamin@webkit.org <benjamin@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 2 Dec 2015 22:12:35 +0000 (22:12 +0000)
committerbenjamin@webkit.org <benjamin@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 2 Dec 2015 22:12:35 +0000 (22:12 +0000)
https://bugs.webkit.org/show_bug.cgi?id=151741

Patch by Benjamin Poulain <bpoulain@apple.com> on 2015-12-02
Reviewed by Geoffrey Garen.

We have plenty of functions without side effects
when lowering DFG.
This patch adds the "PureCall" flag to B3's CCall
to make sure those functions do not prevent optimizations.

* b3/B3CCallValue.h:
* b3/testb3.cpp:
(JSC::B3::testCallSimplePure):
(JSC::B3::run):

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/b3/B3CCallValue.h
Source/JavaScriptCore/b3/testb3.cpp

index 2c8b730..cd49faf 100644 (file)
@@ -1,3 +1,20 @@
+2015-12-02  Benjamin Poulain  <bpoulain@apple.com>
+
+        [JSC] Add a function attribute for Pure functions in B3
+        https://bugs.webkit.org/show_bug.cgi?id=151741
+
+        Reviewed by Geoffrey Garen.
+
+        We have plenty of functions without side effects
+        when lowering DFG.
+        This patch adds the "PureCall" flag to B3's CCall
+        to make sure those functions do not prevent optimizations.
+
+        * b3/B3CCallValue.h:
+        * b3/testb3.cpp:
+        (JSC::B3::testCallSimplePure):
+        (JSC::B3::run):
+
 2015-12-02  Mark Lam  <mark.lam@apple.com>
 
         Removed unnecessary #if USE(JSVALUE64).
index 1c65e9b..c9f5195 100644 (file)
@@ -35,6 +35,7 @@ namespace JSC { namespace B3 {
 
 class JS_EXPORT_PRIVATE CCallValue : public Value {
 public:
+    enum PureFunctionTag { PureFunction };
     static bool accepts(Opcode opcode) { return opcode == CCall; }
 
     ~CCallValue();
@@ -50,6 +51,12 @@ private:
         , effects(Effects::forCall())
     {
     }
+
+    template<typename... Arguments>
+    CCallValue(unsigned index, Type type, Origin origin, PureFunctionTag, Arguments... arguments)
+        : Value(index, CheckedOpcode, CCall, type, origin, arguments...)
+    {
+    }
 };
 
 } } // namespace JSC::B3
index e1c9500..44206e1 100644 (file)
@@ -4724,6 +4724,21 @@ void testCallSimple(int a, int b)
     CHECK(compileAndRun<int>(proc, a, b) == a + b);
 }
 
+void testCallSimplePure(int a, int b)
+{
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    root->appendNew<ControlValue>(
+        proc, Return, Origin(),
+        root->appendNew<CCallValue>(
+            proc, Int32, Origin(), CCallValue::PureFunction,
+            root->appendNew<ConstPtrValue>(proc, Origin(), bitwise_cast<void*>(simpleFunction)),
+            root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0),
+            root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1)));
+
+    CHECK(compileAndRun<int>(proc, a, b) == a + b);
+}
+
 int functionWithHellaArguments(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, int n, int o, int p, int q, int r, int s, int t, int u, int v, int w, int x, int y, int z)
 {
     return (a << 0) + (b << 1) + (c << 2) + (d << 3) + (e << 4) + (f << 5) + (g << 6) + (h << 7) + (i << 8) + (j << 9) + (k << 10) + (l << 11) + (m << 12) + (n << 13) + (o << 14) + (p << 15) + (q << 16) + (r << 17) + (s << 18) + (t << 19) + (u << 20) + (v << 21) + (w << 22) + (x << 23) + (y << 24) + (z << 25);
@@ -5991,6 +6006,7 @@ void run(const char* filter)
     RUN(testInt32ToDoublePartialRegisterWithoutStall());
 
     RUN(testCallSimple(1, 2));
+    RUN(testCallSimplePure(1, 2));
     RUN(testCallFunctionWithHellaArguments());
 
     RUN(testReturnDouble(0.0));