Title: [219038] trunk/Source/_javascript_Core
Revision
219038
Author
[email protected]
Date
2017-06-30 20:35:47 -0700 (Fri, 30 Jun 2017)

Log Message

B3ReduceStrength should reduce EqualOrUnordered over const float input
https://bugs.webkit.org/show_bug.cgi?id=174039

Reviewed by Michael Saboff.

We perform this folding for ConstDoubleValue. It is simply
an oversight that we didn't do it for ConstFloatValue.

* b3/B3ConstFloatValue.cpp:
(JSC::B3::ConstFloatValue::equalOrUnorderedConstant):
* b3/B3ConstFloatValue.h:
* b3/testb3.cpp:
(JSC::B3::testFloatEqualOrUnorderedFolding):
(JSC::B3::testFloatEqualOrUnorderedFoldingNaN):
(JSC::B3::testFloatEqualOrUnorderedDontFold):
(JSC::B3::run):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (219037 => 219038)


--- trunk/Source/_javascript_Core/ChangeLog	2017-07-01 03:24:59 UTC (rev 219037)
+++ trunk/Source/_javascript_Core/ChangeLog	2017-07-01 03:35:47 UTC (rev 219038)
@@ -1,3 +1,22 @@
+2017-06-30  Saam Barati  <[email protected]>
+
+        B3ReduceStrength should reduce EqualOrUnordered over const float input
+        https://bugs.webkit.org/show_bug.cgi?id=174039
+
+        Reviewed by Michael Saboff.
+
+        We perform this folding for ConstDoubleValue. It is simply
+        an oversight that we didn't do it for ConstFloatValue.
+
+        * b3/B3ConstFloatValue.cpp:
+        (JSC::B3::ConstFloatValue::equalOrUnorderedConstant):
+        * b3/B3ConstFloatValue.h:
+        * b3/testb3.cpp:
+        (JSC::B3::testFloatEqualOrUnorderedFolding):
+        (JSC::B3::testFloatEqualOrUnorderedFoldingNaN):
+        (JSC::B3::testFloatEqualOrUnorderedDontFold):
+        (JSC::B3::run):
+
 2017-06-30  Matt Baker  <[email protected]>
 
         Web Inspector: AsyncStackTrace nodes can be corrupted when truncating

Modified: trunk/Source/_javascript_Core/b3/B3ConstFloatValue.cpp (219037 => 219038)


--- trunk/Source/_javascript_Core/b3/B3ConstFloatValue.cpp	2017-07-01 03:24:59 UTC (rev 219037)
+++ trunk/Source/_javascript_Core/b3/B3ConstFloatValue.cpp	2017-07-01 03:35:47 UTC (rev 219038)
@@ -172,6 +172,17 @@
     return triState(m_value >= other->asFloat());
 }
 
+TriState ConstFloatValue::equalOrUnorderedConstant(const Value* other) const
+{
+    if (std::isnan(m_value))
+        return TrueTriState;
+
+    if (!other->hasFloat())
+        return MixedTriState;
+    float otherValue = other->asFloat();
+    return triState(std::isunordered(m_value, otherValue) || m_value == otherValue);
+}
+
 void ConstFloatValue::dumpMeta(CommaPrinter& comma, PrintStream& out) const
 {
     out.print(comma);

Modified: trunk/Source/_javascript_Core/b3/B3ConstFloatValue.h (219037 => 219038)


--- trunk/Source/_javascript_Core/b3/B3ConstFloatValue.h	2017-07-01 03:24:59 UTC (rev 219037)
+++ trunk/Source/_javascript_Core/b3/B3ConstFloatValue.h	2017-07-01 03:35:47 UTC (rev 219038)
@@ -61,6 +61,7 @@
     TriState greaterThanConstant(const Value* other) const override;
     TriState lessEqualConstant(const Value* other) const override;
     TriState greaterEqualConstant(const Value* other) const override;
+    TriState equalOrUnorderedConstant(const Value* other) const override;
 
 protected:
     void dumpMeta(CommaPrinter&, PrintStream&) const override;

Modified: trunk/Source/_javascript_Core/b3/testb3.cpp (219037 => 219038)


--- trunk/Source/_javascript_Core/b3/testb3.cpp	2017-07-01 03:24:59 UTC (rev 219037)
+++ trunk/Source/_javascript_Core/b3/testb3.cpp	2017-07-01 03:35:47 UTC (rev 219038)
@@ -15473,6 +15473,78 @@
     }
 }
 
+void testFloatEqualOrUnorderedFolding()
+{
+    for (auto& first : floatingPointOperands<float>()) {
+        for (auto& second : floatingPointOperands<float>()) {
+            float a = first.value;
+            float b = second.value;
+            bool expectedResult = (a == b) || std::isunordered(a, b);
+            Procedure proc;
+            BasicBlock* root = proc.addBlock();
+            Value* constA = root->appendNew<ConstFloatValue>(proc, Origin(), a);
+            Value* constB = root->appendNew<ConstFloatValue>(proc, Origin(), b);
+
+            root->appendNewControlValue(proc, Return, Origin(),
+                root->appendNew<Value>(
+                    proc, EqualOrUnordered, Origin(),
+                    constA,
+                    constB));
+            CHECK(!!compileAndRun<int32_t>(proc) == expectedResult);
+        }
+    }
+}
+
+void testFloatEqualOrUnorderedFoldingNaN()
+{
+    std::list<float> nans = {
+        bitwise_cast<float>(0xfffffffd),
+        bitwise_cast<float>(0xfffffffe),
+        bitwise_cast<float>(0xfffffff0),
+        static_cast<float>(PNaN),
+    };
+
+    unsigned i = 0;
+    for (float nan : nans) {
+        RELEASE_ASSERT(std::isnan(nan));
+        Procedure proc;
+        BasicBlock* root = proc.addBlock();
+        Value* a = root->appendNew<ConstFloatValue>(proc, Origin(), nan);
+        Value* b = root->appendNew<Value>(proc, DoubleToFloat, Origin(),
+            root->appendNew<ArgumentRegValue>(proc, Origin(), FPRInfo::argumentFPR0));
+
+        if (i % 2)
+            std::swap(a, b);
+        ++i;
+        root->appendNewControlValue(proc, Return, Origin(),
+            root->appendNew<Value>(proc, EqualOrUnordered, Origin(), a, b));
+        CHECK(!!compileAndRun<int32_t>(proc, static_cast<double>(1.0)));
+    }
+}
+
+void testFloatEqualOrUnorderedDontFold()
+{
+    for (auto& first : floatingPointOperands<float>()) {
+        float a = first.value;
+        Procedure proc;
+        BasicBlock* root = proc.addBlock();
+        Value* constA = root->appendNew<ConstFloatValue>(proc, Origin(), a);
+        Value* b = root->appendNew<Value>(proc, DoubleToFloat, Origin(),
+            root->appendNew<ArgumentRegValue>(proc, Origin(), FPRInfo::argumentFPR0));
+        root->appendNewControlValue(proc, Return, Origin(),
+            root->appendNew<Value>(
+                proc, EqualOrUnordered, Origin(), constA, b));
+
+        auto code = compileProc(proc);
+
+        for (auto& second : floatingPointOperands<float>()) {
+            float b = second.value;
+            bool expectedResult = (a == b) || std::isunordered(a, b);
+            CHECK(!!invoke<int32_t>(*code, static_cast<double>(b)) == expectedResult);
+        }
+    }
+}
+
 // Make sure the compiler does not try to optimize anything out.
 NEVER_INLINE double zero()
 {
@@ -17012,6 +17084,10 @@
     RUN(testDoubleLiteralComparison(125.3144446948241, 125.3144446948242));
     RUN(testDoubleLiteralComparison(125.3144446948242, 125.3144446948241));
 
+    RUN(testFloatEqualOrUnorderedFolding());
+    RUN(testFloatEqualOrUnorderedFoldingNaN());
+    RUN(testFloatEqualOrUnorderedDontFold());
+
     if (isX86()) {
         RUN(testBranchBitAndImmFusion(Identity, Int64, 1, Air::BranchTest32, Air::Arg::Tmp));
         RUN(testBranchBitAndImmFusion(Identity, Int64, 0xff, Air::BranchTest32, Air::Arg::Tmp));
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to