Changeset 192345 in webkit


Ignore:
Timestamp:
Nov 11, 2015 7:39:00 PM (8 years ago)
Author:
fpizlo@apple.com
Message:

Patchpoints with stackArgument constraints should work
https://bugs.webkit.org/show_bug.cgi?id=151177

Reviewed by Saam Barati.

The only thing broken was that StackmapSpecial's isValidForm would reject Arg::addr, so
validation would fail after allocateStack.

In order for StackmapSpecial to validate Arg::addr, it needs to know the frame size. To know
the frame size, it needs access to Code&. So, this changes Air::Special to always have a
pointer back to Code.

Other than this already worked.

  • b3/B3StackmapSpecial.cpp:

(JSC::B3::StackmapSpecial::isValidImpl):

  • b3/air/AirCode.cpp:

(JSC::B3::Air::Code::addSpecial):

  • b3/air/AirSpecial.cpp:

(JSC::B3::Air::Special::Special):

  • b3/air/AirSpecial.h:

(JSC::B3::Air::Special::code):

  • b3/testb3.cpp:

(JSC::B3::testSimplePatchpoint):
(JSC::B3::testPatchpointCallArg):
(JSC::B3::testSimpleCheck):
(JSC::B3::run):

Location:
trunk/Source/JavaScriptCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r192334 r192345  
     12015-11-11  Filip Pizlo  <fpizlo@apple.com>
     2
     3        Patchpoints with stackArgument constraints should work
     4        https://bugs.webkit.org/show_bug.cgi?id=151177
     5
     6        Reviewed by Saam Barati.
     7
     8        The only thing broken was that StackmapSpecial's isValidForm would reject Arg::addr, so
     9        validation would fail after allocateStack.
     10
     11        In order for StackmapSpecial to validate Arg::addr, it needs to know the frame size. To know
     12        the frame size, it needs access to Code&. So, this changes Air::Special to always have a
     13        pointer back to Code.
     14
     15        Other than this already worked.
     16
     17        * b3/B3StackmapSpecial.cpp:
     18        (JSC::B3::StackmapSpecial::isValidImpl):
     19        * b3/air/AirCode.cpp:
     20        (JSC::B3::Air::Code::addSpecial):
     21        * b3/air/AirSpecial.cpp:
     22        (JSC::B3::Air::Special::Special):
     23        * b3/air/AirSpecial.h:
     24        (JSC::B3::Air::Special::code):
     25        * b3/testb3.cpp:
     26        (JSC::B3::testSimplePatchpoint):
     27        (JSC::B3::testPatchpointCallArg):
     28        (JSC::B3::testSimpleCheck):
     29        (JSC::B3::run):
     30
    1312015-11-11  Mark Lam  <mark.lam@apple.com>
    232
  • trunk/Source/JavaScriptCore/b3/B3StackmapSpecial.cpp

    r191993 r192345  
    152152            break;
    153153        case ValueRep::StackArgument:
    154             if (arg != Arg::callArg(rep.offsetFromSP()))
    155                 return false;
    156             break;
     154            if (arg == Arg::callArg(rep.offsetFromSP()))
     155                break;
     156            if (arg.isAddr() && code().frameSize()) {
     157                if (arg.base() == Tmp(GPRInfo::callFrameRegister)
     158                    && arg.offset() == rep.offsetFromSP() - code().frameSize())
     159                    break;
     160                if (arg.base() == Tmp(MacroAssembler::stackPointerRegister)
     161                    && arg.offset() == rep.offsetFromSP())
     162                    break;
     163            }
     164            return false;
    157165        case ValueRep::Constant:
    158166            // This is not a valid input representation.
  • trunk/Source/JavaScriptCore/b3/air/AirCode.cpp

    r192183 r192345  
    6969{
    7070    Special* result = special.get();
     71    result->m_code = this;
    7172    m_specials.append(WTF::move(special));
    7273    return result;
  • trunk/Source/JavaScriptCore/b3/air/AirSpecial.cpp

    r191952 r192345  
    3838Special::Special()
    3939    : m_index(UINT_MAX)
     40    , m_code(nullptr)
    4041{
    4142}
  • trunk/Source/JavaScriptCore/b3/air/AirSpecial.h

    r191846 r192345  
    3737namespace JSC { namespace B3 { namespace Air {
    3838
     39class Code;
    3940struct GenerationContext;
    4041
     
    4748    Special();
    4849    virtual ~Special();
     50
     51    Code& code() const { return *m_code; }
    4952
    5053    CString name() const;
     
    98101    const char* m_name;
    99102    unsigned m_index;
     103    Code* m_code;
    100104};
    101105
  • trunk/Source/JavaScriptCore/b3/testb3.cpp

    r192320 r192345  
    25722572            jit.move(params.reps[1].gpr(), params.reps[0].gpr());
    25732573            jit.add32(params.reps[2].gpr(), params.reps[0].gpr());
     2574        });
     2575    root->appendNew<ControlValue>(proc, Return, Origin(), patchpoint);
     2576
     2577    CHECK(compileAndRun<int>(proc, 1, 2) == 3);
     2578}
     2579
     2580void testPatchpointCallArg()
     2581{
     2582    Procedure proc;
     2583    BasicBlock* root = proc.addBlock();
     2584    Value* arg1 = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0);
     2585    Value* arg2 = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1);
     2586    PatchpointValue* patchpoint = root->appendNew<PatchpointValue>(proc, Int32, Origin());
     2587    patchpoint->append(ConstrainedValue(arg1, ValueRep::stackArgument(0)));
     2588    patchpoint->append(ConstrainedValue(arg2, ValueRep::stackArgument(8)));
     2589    patchpoint->setGenerator(
     2590        [&] (CCallHelpers& jit, const StackmapGenerationParams& params) {
     2591            CHECK(params.reps.size() == 3);
     2592            CHECK(params.reps[0].isGPR());
     2593            CHECK(params.reps[1].isStack());
     2594            CHECK(params.reps[2].isStack());
     2595            jit.load32(
     2596                CCallHelpers::Address(GPRInfo::callFrameRegister, params.reps[1].offsetFromFP()),
     2597                params.reps[0].gpr());
     2598            jit.add32(
     2599                CCallHelpers::Address(GPRInfo::callFrameRegister, params.reps[2].offsetFromFP()),
     2600                params.reps[0].gpr());
    25742601        });
    25752602    root->appendNew<ControlValue>(proc, Return, Origin(), patchpoint);
     
    36073634
    36083635    RUN(testSimplePatchpoint());
     3636    RUN(testPatchpointCallArg());
    36093637    RUN(testSimpleCheck());
    36103638    RUN(testCheckLessThan());
Note: See TracChangeset for help on using the changeset viewer.