Skip to content

Commit 39b89da

Browse files
[1.6>1.7] [MERGE #3436 @agarwal-sandeep] OS# 12840992: ARM: Wrong accessor flag offset passed for Getter/Setter inline cache check
Merge pull request #3436 from agarwal-sandeep:vso12840992 Fix is in function GenerateFlagInlineCacheCheckForGetterSetter (lib\Backend\arm\LowerMD.cpp) Removed un-used function GenerateFlagInlineCacheCheckForNoGetterSetter Gives 5% overall gain in speedometer on ARM
2 parents 55a0eb1 + 9a0f838 commit 39b89da

File tree

5 files changed

+3
-61
lines changed

5 files changed

+3
-61
lines changed

lib/Backend/LowerMDShared.cpp

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4012,34 +4012,6 @@ LowererMD::GenerateFlagInlineCacheCheck(
40124012
return branchInstr;
40134013
}
40144014

4015-
IR::BranchInstr *
4016-
LowererMD::GenerateFlagInlineCacheCheckForNoGetterSetter(
4017-
IR::Instr * instrLdSt,
4018-
IR::RegOpnd * opndInlineCache,
4019-
IR::LabelInstr * labelNext)
4020-
{
4021-
// Generate:
4022-
//
4023-
// TEST [&(inlineCache->u.accessor.flags)], (Js::InlineCacheGetterFlag | Js::InlineCacheSetterFlag)
4024-
// JNE $next
4025-
4026-
IR::Instr * instr;
4027-
IR::Opnd* flagsOpnd;
4028-
flagsOpnd = IR::IndirOpnd::New(opndInlineCache, 0, TyInt8, instrLdSt->m_func);
4029-
4030-
// TEST [&(inlineCache->u.accessor.flags)], (Js::InlineCacheGetterFlag | Js::InlineCacheSetterFlag)
4031-
instr = IR::Instr::New(Js::OpCode::TEST,instrLdSt->m_func);
4032-
instr->SetSrc1(flagsOpnd);
4033-
instr->SetSrc2(IR::IntConstOpnd::New((Js::InlineCacheGetterFlag | Js::InlineCacheSetterFlag) << 1, TyInt8, instrLdSt->m_func));
4034-
instrLdSt->InsertBefore(instr);
4035-
4036-
// JNE $next
4037-
IR::BranchInstr * branchInstr = IR::BranchInstr::New(Js::OpCode::JNE, labelNext, instrLdSt->m_func);
4038-
instrLdSt->InsertBefore(branchInstr);
4039-
4040-
return branchInstr;
4041-
}
4042-
40434015
void
40444016
LowererMD::GenerateFlagInlineCacheCheckForGetterSetter(
40454017
IR::Instr * insertBeforeInstr,

lib/Backend/LowerMDShared.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,6 @@ class LowererMD
305305
static IR::BranchInstr * GenerateLocalInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext, bool checkTypeWithoutProperty = false);
306306
static IR::BranchInstr * GenerateProtoInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext);
307307
static IR::BranchInstr * GenerateFlagInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext);
308-
static IR::BranchInstr * GenerateFlagInlineCacheCheckForNoGetterSetter(IR::Instr * instrLdSt, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext);
309308
static IR::BranchInstr * GenerateFlagInlineCacheCheckForLocal(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext);
310309
static void GenerateLdFldFromLocalInlineCache(IR::Instr * instrLdFld, IR::RegOpnd * opndBase, IR::Opnd * opndDst, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot);
311310
static void GenerateLdFldFromProtoInlineCache(IR::Instr * instrLdFld, IR::RegOpnd * opndBase, IR::Opnd * opndDst, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot);

lib/Backend/arm/LowerMD.cpp

Lines changed: 3 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4363,13 +4363,13 @@ LowererMD::GenerateFlagInlineCacheCheckForGetterSetter(
43634363

43644364
// Generate:
43654365
//
4366-
// TST [&(inlineCache->u.flags.flags)], Js::InlineCacheGetterFlag | Js::InlineCacheSetterFlag
4366+
// TST [&(inlineCache->u.accessor.flags)], Js::InlineCacheGetterFlag | Js::InlineCacheSetterFlag
43674367
// BEQ $next
43684368
IR::Instr * instr;
43694369
IR::Opnd* flagsOpnd;
43704370

4371-
flagsOpnd = IR::IndirOpnd::New(opndInlineCache, 0, TyInt8, this->m_func);
4372-
// AND [&(inlineCache->u.flags.flags)], InlineCacheGetterFlag | InlineCacheSetterFlag
4371+
flagsOpnd = IR::IndirOpnd::New(opndInlineCache, (int32)offsetof(Js::InlineCache, u.accessor.rawUInt16), TyInt8, this->m_func);
4372+
// AND [&(inlineCache->u.accessor.flags)], InlineCacheGetterFlag | InlineCacheSetterFlag
43734373
instr = IR::Instr::New(Js::OpCode::TST,this->m_func);
43744374
instr->SetSrc1(flagsOpnd);
43754375
instr->SetSrc2(IR::IntConstOpnd::New(accessorFlagMask, TyInt8, this->m_func));
@@ -4381,33 +4381,6 @@ LowererMD::GenerateFlagInlineCacheCheckForGetterSetter(
43814381
insertBeforeInstr->InsertBefore(instr);
43824382
}
43834383

4384-
IR::BranchInstr *
4385-
LowererMD::GenerateFlagInlineCacheCheckForNoGetterSetter(
4386-
IR::Instr * instrLdSt,
4387-
IR::RegOpnd * opndInlineCache,
4388-
IR::LabelInstr * labelNext)
4389-
{
4390-
// Generate:
4391-
//
4392-
// TST [&(inlineCache->u.flags.flags)], (Js::InlineCacheGetterFlag | Js::InlineCacheSetterFlag)
4393-
// BNE $next
4394-
IR::Instr * instr;
4395-
IR::Opnd* flagsOpnd;
4396-
4397-
flagsOpnd = IR::IndirOpnd::New(opndInlineCache, 0, TyInt8, instrLdSt->m_func);
4398-
instr = IR::Instr::New(Js::OpCode::TST, instrLdSt->m_func);
4399-
instr->SetSrc1(flagsOpnd);
4400-
instr->SetSrc2(IR::IntConstOpnd::New((Js::InlineCacheGetterFlag | Js::InlineCacheSetterFlag) << 1, TyInt8, instrLdSt->m_func));
4401-
instrLdSt->InsertBefore(instr);
4402-
LegalizeMD::LegalizeInstr(instr, false);
4403-
4404-
// BNQ $next
4405-
IR::BranchInstr * branchInstr = IR::BranchInstr::New(Js::OpCode::BNE, labelNext, instrLdSt->m_func);
4406-
instrLdSt->InsertBefore(branchInstr);
4407-
4408-
return branchInstr;
4409-
}
4410-
44114384
IR::BranchInstr *
44124385
LowererMD::GenerateFlagInlineCacheCheck(
44134386
IR::Instr * instrLdSt,

lib/Backend/arm/LowerMD.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,6 @@ class LowererMD
261261
static IR::BranchInstr * GenerateLocalInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext, bool checkTypeWithoutProperty = false);
262262
static IR::BranchInstr * GenerateProtoInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext);
263263
static IR::BranchInstr * GenerateFlagInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext);
264-
static IR::BranchInstr * GenerateFlagInlineCacheCheckForNoGetterSetter(IR::Instr * instrLdSt, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext);
265264
static IR::BranchInstr * GenerateFlagInlineCacheCheckForLocal(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext);
266265
static void GenerateLdFldFromLocalInlineCache(IR::Instr * instrLdFld, IR::RegOpnd * opndBase, IR::Opnd * opndDst, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot);
267266
static void GenerateLdFldFromProtoInlineCache(IR::Instr * instrLdFld, IR::RegOpnd * opndBase, IR::Opnd * opndDst, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot);

lib/Backend/arm64/LowerMD.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,6 @@ class LowererMD
255255
static IR::BranchInstr * GenerateLocalInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext, bool checkTypeWithoutProperty = false) { __debugbreak(); return 0; }
256256
static IR::BranchInstr * GenerateProtoInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext) { __debugbreak(); return 0; }
257257
static IR::BranchInstr * GenerateFlagInlineCacheCheck(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext) { __debugbreak(); return 0; }
258-
static IR::BranchInstr * GenerateFlagInlineCacheCheckForNoGetterSetter(IR::Instr * instrLdSt, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext) { __debugbreak(); return 0; }
259258
static IR::BranchInstr * GenerateFlagInlineCacheCheckForLocal(IR::Instr * instrLdSt, IR::RegOpnd * opndType, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelNext) { __debugbreak(); return 0; }
260259
static void GenerateLdFldFromLocalInlineCache(IR::Instr * instrLdFld, IR::RegOpnd * opndBase, IR::Opnd * opndDst, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot) { __debugbreak(); }
261260
static void GenerateLdFldFromProtoInlineCache(IR::Instr * instrLdFld, IR::RegOpnd * opndBase, IR::Opnd * opndDst, IR::RegOpnd * opndInlineCache, IR::LabelInstr * labelFallThru, bool isInlineSlot) { __debugbreak(); }

0 commit comments

Comments
 (0)