Ignore:
Timestamp:
Jun 30, 2017, 8:35:47 PM (8 years ago)
Author:
[email protected]
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):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/b3/testb3.cpp

    r219026 r219038  
    1547115471
    1547215472        CHECK(!!compileAndRun<int32_t>(proc) == std::get<1>(test)(a, b));
     15473    }
     15474}
     15475
     15476void testFloatEqualOrUnorderedFolding()
     15477{
     15478    for (auto& first : floatingPointOperands<float>()) {
     15479        for (auto& second : floatingPointOperands<float>()) {
     15480            float a = first.value;
     15481            float b = second.value;
     15482            bool expectedResult = (a == b) || std::isunordered(a, b);
     15483            Procedure proc;
     15484            BasicBlock* root = proc.addBlock();
     15485            Value* constA = root->appendNew<ConstFloatValue>(proc, Origin(), a);
     15486            Value* constB = root->appendNew<ConstFloatValue>(proc, Origin(), b);
     15487
     15488            root->appendNewControlValue(proc, Return, Origin(),
     15489                root->appendNew<Value>(
     15490                    proc, EqualOrUnordered, Origin(),
     15491                    constA,
     15492                    constB));
     15493            CHECK(!!compileAndRun<int32_t>(proc) == expectedResult);
     15494        }
     15495    }
     15496}
     15497
     15498void testFloatEqualOrUnorderedFoldingNaN()
     15499{
     15500    std::list<float> nans = {
     15501        bitwise_cast<float>(0xfffffffd),
     15502        bitwise_cast<float>(0xfffffffe),
     15503        bitwise_cast<float>(0xfffffff0),
     15504        static_cast<float>(PNaN),
     15505    };
     15506
     15507    unsigned i = 0;
     15508    for (float nan : nans) {
     15509        RELEASE_ASSERT(std::isnan(nan));
     15510        Procedure proc;
     15511        BasicBlock* root = proc.addBlock();
     15512        Value* a = root->appendNew<ConstFloatValue>(proc, Origin(), nan);
     15513        Value* b = root->appendNew<Value>(proc, DoubleToFloat, Origin(),
     15514            root->appendNew<ArgumentRegValue>(proc, Origin(), FPRInfo::argumentFPR0));
     15515
     15516        if (i % 2)
     15517            std::swap(a, b);
     15518        ++i;
     15519        root->appendNewControlValue(proc, Return, Origin(),
     15520            root->appendNew<Value>(proc, EqualOrUnordered, Origin(), a, b));
     15521        CHECK(!!compileAndRun<int32_t>(proc, static_cast<double>(1.0)));
     15522    }
     15523}
     15524
     15525void testFloatEqualOrUnorderedDontFold()
     15526{
     15527    for (auto& first : floatingPointOperands<float>()) {
     15528        float a = first.value;
     15529        Procedure proc;
     15530        BasicBlock* root = proc.addBlock();
     15531        Value* constA = root->appendNew<ConstFloatValue>(proc, Origin(), a);
     15532        Value* b = root->appendNew<Value>(proc, DoubleToFloat, Origin(),
     15533            root->appendNew<ArgumentRegValue>(proc, Origin(), FPRInfo::argumentFPR0));
     15534        root->appendNewControlValue(proc, Return, Origin(),
     15535            root->appendNew<Value>(
     15536                proc, EqualOrUnordered, Origin(), constA, b));
     15537
     15538        auto code = compileProc(proc);
     15539
     15540        for (auto& second : floatingPointOperands<float>()) {
     15541            float b = second.value;
     15542            bool expectedResult = (a == b) || std::isunordered(a, b);
     15543            CHECK(!!invoke<int32_t>(*code, static_cast<double>(b)) == expectedResult);
     15544        }
    1547315545    }
    1547415546}
     
    1701317085    RUN(testDoubleLiteralComparison(125.3144446948242, 125.3144446948241));
    1701417086
     17087    RUN(testFloatEqualOrUnorderedFolding());
     17088    RUN(testFloatEqualOrUnorderedFoldingNaN());
     17089    RUN(testFloatEqualOrUnorderedDontFold());
     17090
    1701517091    if (isX86()) {
    1701617092        RUN(testBranchBitAndImmFusion(Identity, Int64, 1, Air::BranchTest32, Air::Arg::Tmp));
Note: See TracChangeset for help on using the changeset viewer.