Changeset 247011 in webkit


Ignore:
Timestamp:
Jul 1, 2019 9:59:33 AM (5 years ago)
Author:
Ryan Haddad
Message:

Unreviewed, rolling out r246946.

Caused JSC test crashes on arm64

Reverted changeset:

"Add b3 macro lowering for CheckMul on arm64"
https://bugs.webkit.org/show_bug.cgi?id=199251
https://trac.webkit.org/changeset/246946

Location:
trunk
Files:
3 deleted
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/JSTests/ChangeLog

    r246946 r247011  
     12019-07-01  Ryan Haddad  <ryanhaddad@apple.com>
     2
     3        Unreviewed, rolling out r246946.
     4
     5        Caused JSC test crashes on arm64
     6
     7        Reverted changeset:
     8
     9        "Add b3 macro lowering for CheckMul on arm64"
     10        https://bugs.webkit.org/show_bug.cgi?id=199251
     11        https://trac.webkit.org/changeset/246946
     12
    1132019-06-28  Justin Michaud  <justin_michaud@apple.com>
    214
  • trunk/Source/JavaScriptCore/ChangeLog

    r246946 r247011  
     12019-07-01  Ryan Haddad  <ryanhaddad@apple.com>
     2
     3        Unreviewed, rolling out r246946.
     4
     5        Caused JSC test crashes on arm64
     6
     7        Reverted changeset:
     8
     9        "Add b3 macro lowering for CheckMul on arm64"
     10        https://bugs.webkit.org/show_bug.cgi?id=199251
     11        https://trac.webkit.org/changeset/246946
     12
    1132019-06-28  Justin Michaud  <justin_michaud@apple.com>
    214
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h

    r246946 r247011  
    570570    }
    571571
    572     void multiplySignExtend32(RegisterID left, RegisterID right, RegisterID dest)
    573     {
    574         m_assembler.smull(dest, left, right);
    575     }
    576 
    577572    void div32(RegisterID dividend, RegisterID divisor, RegisterID dest)
    578573    {
  • trunk/Source/JavaScriptCore/assembler/testmasm.cpp

    r246946 r247011  
    352352}
    353353
    354 #if CPU(ARM64)
    355 void testMul32SignExtend()
    356 {
    357     for (auto value : int32Operands()) {
    358         auto mul = compile([=] (CCallHelpers& jit) {
    359             jit.emitFunctionPrologue();
    360 
    361             jit.multiplySignExtend32(GPRInfo::argumentGPR0, GPRInfo::argumentGPR1, GPRInfo::returnValueGPR);
    362 
    363             jit.emitFunctionEpilogue();
    364             jit.ret();
    365         });
    366 
    367         for (auto value2 : int32Operands())
    368             CHECK_EQ(invoke<long int>(mul, value, value2), ((long int) value) * ((long int) value2));
    369     }
    370 }
    371 #endif
    372 
    373354#if CPU(X86) || CPU(X86_64) || CPU(ARM64)
    374355void testCompareFloat(MacroAssembler::DoubleCondition condition)
     
    11301111    RUN(testMul32WithImmediates());
    11311112
    1132 #if CPU(ARM64)
    1133     RUN(testMul32SignExtend());
    1134 #endif
    1135 
    11361113#if CPU(X86) || CPU(X86_64) || CPU(ARM64)
    11371114    RUN(testCompareFloat(MacroAssembler::DoubleEqual));
  • trunk/Source/JavaScriptCore/b3/B3LowerMacros.cpp

    r246946 r247011  
    178178            }
    179179
    180             case CheckMul: {
    181                 if (isARM64() && m_value->child(0)->type() == Int32) {
    182                     CheckValue* checkMul = m_value->as<CheckValue>();
    183 
    184                     Value* left = m_insertionSet.insert<Value>(m_index, SExt32, m_origin, m_value->child(0));
    185                     Value* right = m_insertionSet.insert<Value>(m_index, SExt32, m_origin, m_value->child(1));
    186                     Value* mulResult = m_insertionSet.insert<Value>(m_index, Mul, m_origin, left, right);
    187                     Value* mulResult32 = m_insertionSet.insert<Value>(m_index, Trunc, m_origin, mulResult);
    188                     Value* upperResult = m_insertionSet.insert<Value>(m_index, Trunc, m_origin,
    189                         m_insertionSet.insert<Value>(m_index, SShr, m_origin, mulResult, m_insertionSet.insert<Const32Value>(m_index, m_origin, 32)));
    190                     Value* signBit = m_insertionSet.insert<Value>(m_index, SShr, m_origin,
    191                         mulResult32,
    192                         m_insertionSet.insert<Const32Value>(m_index, m_origin, 31));
    193                     Value* hasOverflowed = m_insertionSet.insert<Value>(m_index, NotEqual, m_origin, upperResult, signBit);
    194 
    195                     CheckValue* check = m_insertionSet.insert<CheckValue>(m_index, Check, m_origin, hasOverflowed);
    196                     check->setGenerator(checkMul->generator());
    197                     check->clobberEarly(checkMul->earlyClobbered());
    198                     check->clobberLate(checkMul->lateClobbered());
    199                     check->append(checkMul->constrainedChild(0));
    200                     check->append(checkMul->constrainedChild(1));
    201 
    202                     m_value->replaceWithIdentity(mulResult32);
    203                     m_changed = true;
    204                 }
    205                 break;
    206             }
    207 
    208180            case Switch: {
    209181                SwitchValue* switchValue = m_value->as<SwitchValue>();
  • trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp

    r246946 r247011  
    26032603
    26042604        case Mul: {
    2605             if (m_value->type() == Int64
    2606                 && isValidForm(MultiplySignExtend32, Arg::Tmp, Arg::Tmp, Arg::Tmp)
    2607                 && m_value->child(0)->opcode() == SExt32
    2608                 && !m_locked.contains(m_value->child(0))) {
    2609                 Value* opLeft = m_value->child(0);
    2610                 Value* left = opLeft->child(0);
    2611                 Value* opRight = m_value->child(1);
    2612                 Value* right = nullptr;
    2613 
    2614                 if (opRight->opcode() == SExt32 && !m_locked.contains(opRight->child(0))) {
    2615                     right = opRight->child(0);
    2616                 } else if (m_value->child(1)->isRepresentableAs<int32_t>() && !m_locked.contains(m_value->child(1))) {
    2617                     // We just use the 64-bit const int as a 32 bit const int directly
    2618                     right = opRight;
    2619                 }
    2620 
    2621                 if (right) {
    2622                     append(MultiplySignExtend32, tmp(left), tmp(right), tmp(m_value));
    2623                     return;
    2624                 }
    2625             }
    26262605            appendBinOp<Mul32, Mul64, MulDouble, MulFloat, Commutative>(
    26272606                m_value->child(0), m_value->child(1));
  • trunk/Source/JavaScriptCore/b3/air/AirOpcode.opcodes

    r246946 r247011  
    262262    Tmp, Tmp, Tmp
    263263
    264 arm64: MultiplySignExtend32 U:G:32, U:G:32, ZD:G:64
    265     Tmp, Tmp, Tmp
    266 
    267264arm64: Div32 U:G:32, U:G:32, ZD:G:32
    268265    Tmp, Tmp, Tmp
  • trunk/Source/JavaScriptCore/b3/testb3.cpp

    r246946 r247011  
    11901190}
    11911191
    1192 void testMulArgs32SignExtend(int a, int b)
    1193 {
    1194     Procedure proc;
    1195     if (proc.optLevel() < 1)
    1196         return;
    1197     BasicBlock* root = proc.addBlock();
    1198     Value* arg1 = root->appendNew<Value>(
    1199         proc, Trunc, Origin(),
    1200         root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0));
    1201     Value* arg2 = root->appendNew<Value>(
    1202         proc, Trunc, Origin(),
    1203         root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1));
    1204     Value* arg164 = root->appendNew<Value>(proc, SExt32, Origin(), arg1);
    1205     Value* arg264 = root->appendNew<Value>(proc, SExt32, Origin(), arg2);
    1206     Value* mul = root->appendNew<Value>(proc, Mul, Origin(), arg164, arg264);
    1207     root->appendNewControlValue(proc, Return, Origin(), mul);
    1208 
    1209     auto code = compileProc(proc);
    1210 
    1211     CHECK(invoke<long int>(*code, a, b) == ((long int) a) * ((long int) b));
    1212 }
    1213 
    1214 void testMulImm32SignExtend(const int a, int b)
    1215 {
    1216     Procedure proc;
    1217     if (proc.optLevel() < 1)
    1218         return;
    1219     BasicBlock* root = proc.addBlock();
    1220     Value* arg1 = root->appendNew<Const64Value>(proc, Origin(), a);
    1221     Value* arg2 = root->appendNew<Value>(
    1222         proc, Trunc, Origin(),
    1223         root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1));
    1224     Value* arg264 = root->appendNew<Value>(proc, SExt32, Origin(), arg2);
    1225     Value* mul = root->appendNew<Value>(proc, Mul, Origin(), arg1, arg264);
    1226     root->appendNewControlValue(proc, Return, Origin(), mul);
    1227 
    1228     auto code = compileProc(proc);
    1229 
    1230     CHECK(invoke<long int>(*code, b) == ((long int) a) * ((long int) b));
    1231 }
    1232 
    12331192void testMulLoadTwice()
    12341193{
     
    1467714636{
    1467814637    Procedure proc;
    14679 
    14680     BasicBlock* root = proc.addBlock();
    14681 
     14638   
     14639    BasicBlock* root = proc.addBlock();
     14640   
    1468214641    root->appendNew<FenceValue>(proc, Origin());
    1468314642    root->appendNew<Value>(proc, Return, Origin(), root->appendIntConstant(proc, Origin(), Int32, 42));
    14684 
     14643   
    1468514644    auto code = compileProc(proc);
    1468614645    CHECK_EQ(invoke<int>(*code), 42);
     
    1468814647        checkUsesInstruction(*code, "lock or $0x0, (%rsp)");
    1468914648    if (isARM64())
    14690         checkUsesInstruction(*code, "dmb     ish");
     14649        checkUsesInstruction(*code, "dmb    ish");
    1469114650    checkDoesNotUseInstruction(*code, "mfence");
    14692     checkDoesNotUseInstruction(*code, "dmb     ishst");
     14651    checkDoesNotUseInstruction(*code, "dmb    ishst");
    1469314652}
    1469414653
     
    1469614655{
    1469714656    Procedure proc;
    14698 
    14699     BasicBlock* root = proc.addBlock();
    14700 
     14657   
     14658    BasicBlock* root = proc.addBlock();
     14659   
    1470114660    root->appendNew<FenceValue>(proc, Origin(), HeapRange::top(), HeapRange());
    1470214661    root->appendNew<Value>(proc, Return, Origin(), root->appendIntConstant(proc, Origin(), Int32, 42));
    14703 
     14662   
    1470414663    auto code = compileProc(proc);
    1470514664    CHECK_EQ(invoke<int>(*code), 42);
     
    1470714666    checkDoesNotUseInstruction(*code, "mfence");
    1470814667    if (isARM64())
    14709         checkUsesInstruction(*code, "dmb     ishst");
     14668        checkUsesInstruction(*code, "dmb    ishst");
    1471014669}
    1471114670
     
    1471314672{
    1471414673    Procedure proc;
    14715 
    14716     BasicBlock* root = proc.addBlock();
    14717 
     14674   
     14675    BasicBlock* root = proc.addBlock();
     14676   
    1471814677    root->appendNew<FenceValue>(proc, Origin(), HeapRange(), HeapRange::top());
    1471914678    root->appendNew<Value>(proc, Return, Origin(), root->appendIntConstant(proc, Origin(), Int32, 42));
    14720 
     14679   
    1472114680    auto code = compileProc(proc);
    1472214681    CHECK_EQ(invoke<int>(*code), 42);
     
    1472414683    checkDoesNotUseInstruction(*code, "mfence");
    1472514684    if (isARM64())
    14726         checkUsesInstruction(*code, "dmb     ish");
    14727     checkDoesNotUseInstruction(*code, "dmb     ishst");
     14685        checkUsesInstruction(*code, "dmb    ish");
     14686    checkDoesNotUseInstruction(*code, "dmb    ishst");
    1472814687}
    1472914688
     
    1500314962        CHECK_EQ(usesCSRs, !pin);
    1500414963    };
    15005 
     14964   
    1500614965    go(true);
    1500714966    go(false);
     
    1719917158
    1720017159    auto shouldRun = [&] (const char* testName) -> bool {
    17201         // FIXME: These tests fail <https://bugs.webkit.org/show_bug.cgi?id=199330>.
    17202         if (!filter && isARM64()) {
    17203             for (auto& failingTest : {
    17204                 "testReportUsedRegistersLateUseFollowedByEarlyDefDoesNotMarkUseAsDead",
    17205                 "testNegFloatWithUselessDoubleConversion",
    17206                 "testPinRegisters",
    17207             }) {
    17208                 if (WTF::findIgnoringASCIICaseWithoutLength(testName, failingTest) != WTF::notFound) {
    17209                     dataLogLn("*** Warning: Skipping known-bad test: ", testName);
    17210                     return false;
    17211                 }
    17212             }
    17213         }
    17214         if (!filter && isX86()) {
    17215             for (auto& failingTest : {
    17216                 "testReportUsedRegistersLateUseFollowedByEarlyDefDoesNotMarkUseAsDead",
    17217             }) {
    17218                 if (WTF::findIgnoringASCIICaseWithoutLength(testName, failingTest) != WTF::notFound) {
    17219                     dataLogLn("*** Warning: Skipping known-bad test: ", testName);
    17220                     return false;
    17221                 }
    17222             }
    17223         }
    1722417160        return !filter || WTF::findIgnoringASCIICaseWithoutLength(testName, filter) != WTF::notFound;
    1722517161    };
     
    1734217278    RUN(testMulImmArg(1, 0));
    1734317279    RUN(testMulImmArg(3, 3));
    17344     RUN(testMulImm32SignExtend(1, 2));
    17345     RUN(testMulImm32SignExtend(0, 2));
    17346     RUN(testMulImm32SignExtend(1, 0));
    17347     RUN(testMulImm32SignExtend(3, 3));
    17348     RUN(testMulImm32SignExtend(0xFFFFFFFF, 0xFFFFFFFF));
    17349     RUN(testMulImm32SignExtend(0xFFFFFFFE, 0xFFFFFFFF));
    17350     RUN(testMulImm32SignExtend(0xFFFFFFFF, 0xFFFFFFFE));
    1735117280    RUN(testMulArgs32(1, 1));
    1735217281    RUN(testMulArgs32(1, 2));
    17353     RUN(testMulArgs32(0xFFFFFFFF, 0xFFFFFFFF));
    17354     RUN(testMulArgs32(0xFFFFFFFE, 0xFFFFFFFF));
    17355     RUN(testMulArgs32SignExtend(1, 1));
    17356     RUN(testMulArgs32SignExtend(1, 2));
    17357     RUN(testMulArgs32SignExtend(0xFFFFFFFF, 0xFFFFFFFF));
    17358     RUN(testMulArgs32SignExtend(0xFFFFFFFE, 0xFFFFFFFF));
    1735917282    RUN(testMulLoadTwice());
    1736017283    RUN(testMulAddArgsLeft());
Note: See TracChangeset for help on using the changeset viewer.