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
