Fix function pointer const propagation

This commit is contained in:
drmortalwombat 2024-09-16 17:16:45 +02:00
parent 73dece7b58
commit 5aeec2fad4
2 changed files with 67 additions and 50 deletions

View File

@ -1606,7 +1606,7 @@ static InterOperand OperandConstantFolding(InterOperator oper, InterOperand op1,
return dop; return dop;
} }
static void LoadConstantFold(InterInstruction* ins, InterInstruction* ains, const GrowingVariableArray& staticVars) static void LoadConstantFold(InterInstruction* ins, InterInstruction* ains, const GrowingVariableArray& staticVars, const GrowingInterCodeProcedurePtrArray&staticProcs)
{ {
const uint8* data; const uint8* data;
@ -1649,15 +1649,32 @@ static void LoadConstantFold(InterInstruction* ins, InterInstruction* ains, cons
int j = 0; int j = 0;
while (j < staticVars.Size() && !(staticVars[j] && staticVars[j]->mLinkerObject == lobj->mReferences[i]->mRefObject)) while (j < staticVars.Size() && !(staticVars[j] && staticVars[j]->mLinkerObject == lobj->mReferences[i]->mRefObject))
j++; j++;
if (j < staticVars.Size())
{
ins->mConst.mMemory = IM_GLOBAL;
ins->mConst.mVarIndex = staticVars[j]->mIndex;
}
else
{
j = 0;
while (j < staticProcs.Size() && !(staticProcs[j] && staticProcs[j]->mLinkerObject == lobj->mReferences[i]->mRefObject))
j++;
if (j < staticProcs.Size())
{
ins->mConst.mMemory = IM_PROCEDURE;
ins->mConst.mVarIndex = staticProcs[j]->mID;
}
else
{
ins->mConst.mMemory = IM_GLOBAL;
ins->mConst.mVarIndex = -1;
}
}
ins->mConst.mLinkerObject = lobj->mReferences[i]->mRefObject; ins->mConst.mLinkerObject = lobj->mReferences[i]->mRefObject;
ins->mConst.mIntConst = lobj->mReferences[i]->mRefOffset; ins->mConst.mIntConst = lobj->mReferences[i]->mRefOffset;
ins->mConst.mMemory = IM_GLOBAL;
ins->mConst.mOperandSize = ins->mConst.mLinkerObject->mSize; ins->mConst.mOperandSize = ins->mConst.mLinkerObject->mSize;
if (j < staticVars.Size())
ins->mConst.mVarIndex = staticVars[j]->mIndex;
else
ins->mConst.mVarIndex = -1;
} }
else else
{ {
@ -2356,7 +2373,7 @@ bool InterInstruction::IsEqualSource(const InterInstruction* ins) const
void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrArray& tvalue, const NumberSet& aliasedLocals, const NumberSet& aliasedParams, const GrowingVariableArray& staticVars) void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrArray& tvalue, const NumberSet& aliasedLocals, const NumberSet& aliasedParams, const GrowingVariableArray& staticVars, const GrowingInterCodeProcedurePtrArray& staticProcs)
{ {
int i, temp; int i, temp;
@ -2439,7 +2456,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
} }
else if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT && tvalue[ins->mSrc[0].mTemp]->mConst.mMemory == IM_GLOBAL && (tvalue[ins->mSrc[0].mTemp]->mConst.mLinkerObject->mFlags & LOBJF_CONST)) else if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT && tvalue[ins->mSrc[0].mTemp]->mConst.mMemory == IM_GLOBAL && (tvalue[ins->mSrc[0].mTemp]->mConst.mLinkerObject->mFlags & LOBJF_CONST))
{ {
LoadConstantFold(ins, tvalue[ins->mSrc[0].mTemp], staticVars); LoadConstantFold(ins, tvalue[ins->mSrc[0].mTemp], staticVars, staticProcs);
InsertValue(ins); InsertValue(ins);
} }
else else
@ -2639,7 +2656,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
ins->mSrc[1].mTemp = -1; ins->mSrc[1].mTemp = -1;
ins->mNumOperands = 0; ins->mNumOperands = 0;
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars, staticProcs);
return; return;
} }
@ -2659,7 +2676,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
ins->mNumOperands = 1; ins->mNumOperands = 1;
assert(ins->mSrc[0].mTemp >= 0); assert(ins->mSrc[0].mTemp >= 0);
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars, staticProcs);
return; return;
} }
@ -2671,7 +2688,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
ins->mSrc[1].mTemp = -1; ins->mSrc[1].mTemp = -1;
ins->mNumOperands = 0; ins->mNumOperands = 0;
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars, staticProcs);
return; return;
} }
@ -2684,7 +2701,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
ins->mSrc[1].mType = IT_NONE; ins->mSrc[1].mType = IT_NONE;
ins->mNumOperands = 1; ins->mNumOperands = 1;
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars, staticProcs);
return; return;
} }
@ -2700,7 +2717,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
ins->mNumOperands = 1; ins->mNumOperands = 1;
assert(ins->mSrc[0].mTemp >= 0); assert(ins->mSrc[0].mTemp >= 0);
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars, staticProcs);
return; return;
} }
@ -2713,7 +2730,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
ins->mSrc[1].mTemp = -1; ins->mSrc[1].mTemp = -1;
ins->mNumOperands = 0; ins->mNumOperands = 0;
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars, staticProcs);
return; return;
} }
@ -2725,7 +2742,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
ins->mSrc[1].mType = IT_NONE; ins->mSrc[1].mType = IT_NONE;
ins->mNumOperands = 1; ins->mNumOperands = 1;
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars, staticProcs);
return; return;
} }
@ -2736,7 +2753,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
ins->mSrc[1].mTemp = -1; ins->mSrc[1].mTemp = -1;
ins->mNumOperands = 1; ins->mNumOperands = 1;
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars, staticProcs);
return; return;
} }
@ -2751,7 +2768,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
ins->mSrc[1].mTemp = -1; ins->mSrc[1].mTemp = -1;
ins->mNumOperands = 0; ins->mNumOperands = 0;
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars, staticProcs);
return; return;
} }
@ -2762,7 +2779,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
ins->mNumOperands = 1; ins->mNumOperands = 1;
assert(ins->mSrc[0].mTemp >= 0); assert(ins->mSrc[0].mTemp >= 0);
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars, staticProcs);
return; return;
} }
@ -2987,7 +3004,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
ins->mSrc[1].mTemp = -1; ins->mSrc[1].mTemp = -1;
ins->mNumOperands = 0; ins->mNumOperands = 0;
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars, staticProcs);
} }
break; break;
case IT_POINTER: case IT_POINTER:
@ -3002,7 +3019,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
ins->mSrc[1].mTemp = -1; ins->mSrc[1].mTemp = -1;
ins->mNumOperands = 0; ins->mNumOperands = 0;
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars, staticProcs);
} }
else if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONVERSION_OPERATOR && else if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONVERSION_OPERATOR &&
ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONVERSION_OPERATOR && ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONVERSION_OPERATOR &&
@ -3015,7 +3032,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
ins->mSrc[1].mType = tvalue[ins->mSrc[1].mTemp]->mSrc[0].mType; ins->mSrc[1].mType = tvalue[ins->mSrc[1].mTemp]->mSrc[0].mType;
ins->mSrc[1].mTemp = tvalue[ins->mSrc[1].mTemp]->mSrc[0].mTemp; ins->mSrc[1].mTemp = tvalue[ins->mSrc[1].mTemp]->mSrc[0].mTemp;
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars, staticProcs);
} }
else if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONVERSION_OPERATOR && else if (ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONVERSION_OPERATOR &&
ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT && ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONSTANT &&
@ -3215,7 +3232,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
ins->mSrc[1].mTemp = tvalue[ins->mSrc[1].mTemp]->mSrc[0].mTemp; ins->mSrc[1].mTemp = tvalue[ins->mSrc[1].mTemp]->mSrc[0].mTemp;
} }
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars, staticProcs);
} }
else if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONVERSION_OPERATOR && else if (ins->mSrc[0].mTemp >= 0 && tvalue[ins->mSrc[0].mTemp] && tvalue[ins->mSrc[0].mTemp]->mCode == IC_CONVERSION_OPERATOR &&
ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT && ins->mSrc[1].mTemp >= 0 && tvalue[ins->mSrc[1].mTemp] && tvalue[ins->mSrc[1].mTemp]->mCode == IC_CONSTANT &&
@ -3415,7 +3432,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
ins->mSrc[0].mTemp = tvalue[ins->mSrc[0].mTemp]->mSrc[0].mTemp; ins->mSrc[0].mTemp = tvalue[ins->mSrc[0].mTemp]->mSrc[0].mTemp;
} }
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars, staticProcs);
} }
else if (ins->mSrc[1].mTemp == ins->mSrc[0].mTemp) else if (ins->mSrc[1].mTemp == ins->mSrc[0].mTemp)
{ {
@ -3442,7 +3459,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
ins->mSrc[1].mTemp = -1; ins->mSrc[1].mTemp = -1;
ins->mNumOperands = 0; ins->mNumOperands = 0;
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars, staticProcs);
} }
break; break;
} }
@ -5976,7 +5993,7 @@ static bool ispow2(int64 v)
return 0; return 0;
} }
void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingInstructionPtrArray& tvalue, const GrowingVariableArray& staticVars, FastNumberSet& fsingle) void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingInstructionPtrArray& tvalue, const GrowingVariableArray& staticVars, const GrowingInterCodeProcedurePtrArray& staticProcs, FastNumberSet& fsingle)
{ {
switch (ins->mCode) switch (ins->mCode)
{ {
@ -6057,7 +6074,7 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction * ins, const GrowingI
OptimizeAddress(ins, tvalue, 0); OptimizeAddress(ins, tvalue, 0);
if (ins->mSrc[0].mTemp < 0 && ins->mSrc[0].mMemory == IM_GLOBAL && (ins->mSrc[0].mLinkerObject->mFlags & LOBJF_CONST)) if (ins->mSrc[0].mTemp < 0 && ins->mSrc[0].mMemory == IM_GLOBAL && (ins->mSrc[0].mLinkerObject->mFlags & LOBJF_CONST))
LoadConstantFold(ins, nullptr, staticVars); LoadConstantFold(ins, nullptr, staticVars, staticProcs);
break; break;
case IC_STORE: case IC_STORE:
@ -10960,7 +10977,7 @@ bool InterCodeBasicBlock::SimplifyIntegerNumeric(const GrowingInstructionPtrArra
return changed; return changed;
} }
void InterCodeBasicBlock::PerformValueForwarding(const GrowingInstructionPtrArray& tvalue, const ValueSet& values, FastNumberSet& tvalid, const NumberSet& aliasedLocals, const NumberSet& aliasedParams, int& spareTemps, const GrowingVariableArray& staticVars) void InterCodeBasicBlock::PerformValueForwarding(const GrowingInstructionPtrArray& tvalue, const ValueSet& values, FastNumberSet& tvalid, const NumberSet& aliasedLocals, const NumberSet& aliasedParams, int& spareTemps, const GrowingVariableArray& staticVars, const GrowingInterCodeProcedurePtrArray& staticProcs)
{ {
int i; int i;
@ -11349,16 +11366,16 @@ void InterCodeBasicBlock::PerformValueForwarding(const GrowingInstructionPtrArra
} }
#endif #endif
lvalues.UpdateValue(mInstructions[i], ltvalue, aliasedLocals, aliasedParams, staticVars); lvalues.UpdateValue(mInstructions[i], ltvalue, aliasedLocals, aliasedParams, staticVars, staticProcs);
mInstructions[i]->PerformValueForwarding(ltvalue, tvalid); mInstructions[i]->PerformValueForwarding(ltvalue, tvalid);
} }
if (mTrueJump) mTrueJump->PerformValueForwarding(ltvalue, lvalues, tvalid, aliasedLocals, aliasedParams, spareTemps, staticVars); if (mTrueJump) mTrueJump->PerformValueForwarding(ltvalue, lvalues, tvalid, aliasedLocals, aliasedParams, spareTemps, staticVars, staticProcs);
if (mFalseJump) mFalseJump->PerformValueForwarding(ltvalue, lvalues, tvalid, aliasedLocals, aliasedParams, spareTemps, staticVars); if (mFalseJump) mFalseJump->PerformValueForwarding(ltvalue, lvalues, tvalid, aliasedLocals, aliasedParams, spareTemps, staticVars, staticProcs);
} }
} }
void InterCodeBasicBlock::PerformMachineSpecificValueUsageCheck(const GrowingInstructionPtrArray& tvalue, FastNumberSet& tvalid, const GrowingVariableArray& staticVars, FastNumberSet &fsingle) void InterCodeBasicBlock::PerformMachineSpecificValueUsageCheck(const GrowingInstructionPtrArray& tvalue, FastNumberSet& tvalid, const GrowingVariableArray& staticVars, const GrowingInterCodeProcedurePtrArray& staticProcs, FastNumberSet &fsingle)
{ {
int i; int i;
@ -11408,12 +11425,12 @@ void InterCodeBasicBlock::PerformMachineSpecificValueUsageCheck(const GrowingIns
for (i = 0; i < mInstructions.Size(); i++) for (i = 0; i < mInstructions.Size(); i++)
{ {
CheckValueUsage(mInstructions[i], ltvalue, staticVars, fsingle); CheckValueUsage(mInstructions[i], ltvalue, staticVars, staticProcs, fsingle);
mInstructions[i]->PerformValueForwarding(ltvalue, tvalid); mInstructions[i]->PerformValueForwarding(ltvalue, tvalid);
} }
if (mTrueJump) mTrueJump->PerformMachineSpecificValueUsageCheck(ltvalue, tvalid, staticVars, fsingle); if (mTrueJump) mTrueJump->PerformMachineSpecificValueUsageCheck(ltvalue, tvalid, staticVars, staticProcs, fsingle);
if (mFalseJump) mFalseJump->PerformMachineSpecificValueUsageCheck(ltvalue, tvalid, staticVars, fsingle); if (mFalseJump) mFalseJump->PerformMachineSpecificValueUsageCheck(ltvalue, tvalid, staticVars, staticProcs, fsingle);
} }
} }
@ -18536,7 +18553,7 @@ void InterCodeBasicBlock::CheckBlocks(void)
} }
bool InterCodeBasicBlock::PeepholeReplaceOptimization(const GrowingVariableArray& staticVars) bool InterCodeBasicBlock::PeepholeReplaceOptimization(const GrowingVariableArray& staticVars, const GrowingInterCodeProcedurePtrArray& staticProcs)
{ {
int j = 0; int j = 0;
for (int i = 0; i < mInstructions.Size(); i++) for (int i = 0; i < mInstructions.Size(); i++)
@ -18560,7 +18577,7 @@ bool InterCodeBasicBlock::PeepholeReplaceOptimization(const GrowingVariableArray
} }
if (mInstructions[i]->mCode == IC_LOAD && mInstructions[i]->mSrc[0].mMemory == IM_GLOBAL && (mInstructions[i]->mSrc[0].mLinkerObject->mFlags & LOBJF_CONST)) if (mInstructions[i]->mCode == IC_LOAD && mInstructions[i]->mSrc[0].mMemory == IM_GLOBAL && (mInstructions[i]->mSrc[0].mLinkerObject->mFlags & LOBJF_CONST))
{ {
LoadConstantFold(mInstructions[i], nullptr, staticVars); LoadConstantFold(mInstructions[i], nullptr, staticVars, staticProcs);
changed = true; changed = true;
} }
@ -19865,7 +19882,7 @@ bool InterCodeBasicBlock::CommonTailCodeMerge(void)
return changed; return changed;
} }
void InterCodeBasicBlock::PeepholeOptimization(const GrowingVariableArray& staticVars) void InterCodeBasicBlock::PeepholeOptimization(const GrowingVariableArray& staticVars, const GrowingInterCodeProcedurePtrArray& staticProcs)
{ {
int i; int i;
@ -20164,7 +20181,7 @@ void InterCodeBasicBlock::PeepholeOptimization(const GrowingVariableArray& stati
CheckFinalLocal(); CheckFinalLocal();
do {} while (PeepholeReplaceOptimization(staticVars)); do {} while (PeepholeReplaceOptimization(staticVars, staticProcs));
// build trains // build trains
#if 1 #if 1
@ -20373,12 +20390,12 @@ void InterCodeBasicBlock::PeepholeOptimization(const GrowingVariableArray& stati
CheckFinalLocal(); CheckFinalLocal();
do {} while (PeepholeReplaceOptimization(staticVars)); do {} while (PeepholeReplaceOptimization(staticVars, staticProcs));
CheckFinalLocal(); CheckFinalLocal();
if (mTrueJump) mTrueJump->PeepholeOptimization(staticVars); if (mTrueJump) mTrueJump->PeepholeOptimization(staticVars, staticProcs);
if (mFalseJump) mFalseJump->PeepholeOptimization(staticVars); if (mFalseJump) mFalseJump->PeepholeOptimization(staticVars, staticProcs);
} }
} }
@ -21232,7 +21249,7 @@ void InterCodeProcedure::PeepholeOptimization(void)
CheckFinal(); CheckFinal();
ResetVisited(); ResetVisited();
mEntryBlock->PeepholeOptimization(mModule->mGlobalVars); mEntryBlock->PeepholeOptimization(mModule->mGlobalVars, mModule->mProcedures);
Disassemble("PeepholeOptimization"); Disassemble("PeepholeOptimization");
CheckFinal(); CheckFinal();
@ -22031,7 +22048,7 @@ void InterCodeProcedure::Close(void)
tvalidSet.Reset(numTemps + 64); tvalidSet.Reset(numTemps + 64);
ResetVisited(); ResetVisited();
mEntryBlock->PerformValueForwarding(mValueForwardingTable, valueSet, tvalidSet, mLocalAliasedSet, mParamAliasedSet, numTemps, mModule->mGlobalVars); mEntryBlock->PerformValueForwarding(mValueForwardingTable, valueSet, tvalidSet, mLocalAliasedSet, mParamAliasedSet, numTemps, mModule->mGlobalVars, mModule->mProcedures);
assert(numTemps <= tvalidSet.Size()); assert(numTemps <= tvalidSet.Size());
@ -22072,7 +22089,7 @@ void InterCodeProcedure::Close(void)
mEntryBlock->CalculateSingleUsedTemps(fusedSet, fsingleSet); mEntryBlock->CalculateSingleUsedTemps(fusedSet, fsingleSet);
ResetVisited(); ResetVisited();
mEntryBlock->PerformMachineSpecificValueUsageCheck(mValueForwardingTable, tvalidSet, mModule->mGlobalVars, fsingleSet); mEntryBlock->PerformMachineSpecificValueUsageCheck(mValueForwardingTable, tvalidSet, mModule->mGlobalVars, mModule->mProcedures, fsingleSet);
DisassembleDebug("machine value forwarding"); DisassembleDebug("machine value forwarding");

View File

@ -211,7 +211,7 @@ public:
void RemoveValue(int index); void RemoveValue(int index);
void InsertValue(InterInstruction * ins); void InsertValue(InterInstruction * ins);
void UpdateValue(InterInstruction * ins, const GrowingInstructionPtrArray& tvalue, const NumberSet& aliasedLocals, const NumberSet& aliasedParams, const GrowingVariableArray& staticVars); void UpdateValue(InterInstruction * ins, const GrowingInstructionPtrArray& tvalue, const NumberSet& aliasedLocals, const NumberSet& aliasedParams, const GrowingVariableArray& staticVars, const GrowingInterCodeProcedurePtrArray& staticProcs);
void Intersect(ValueSet& set); void Intersect(ValueSet& set);
}; };
@ -494,10 +494,10 @@ public:
void GlobalRenameRegister(const GrowingIntArray& renameTable, GrowingTypeArray& temporaries); void GlobalRenameRegister(const GrowingIntArray& renameTable, GrowingTypeArray& temporaries);
void RenameValueRanges(const GrowingIntArray& renameTable, int numTemps); void RenameValueRanges(const GrowingIntArray& renameTable, int numTemps);
void CheckValueUsage(InterInstruction * ins, const GrowingInstructionPtrArray& tvalue, const GrowingVariableArray& staticVars, FastNumberSet& fsingle); void CheckValueUsage(InterInstruction * ins, const GrowingInstructionPtrArray& tvalue, const GrowingVariableArray& staticVars, const GrowingInterCodeProcedurePtrArray& staticProcs, FastNumberSet& fsingle);
void PerformTempForwarding(const TempForwardingTable& forwardingTable, bool reverse, bool checkloops); void PerformTempForwarding(const TempForwardingTable& forwardingTable, bool reverse, bool checkloops);
void PerformValueForwarding(const GrowingInstructionPtrArray& tvalue, const ValueSet& values, FastNumberSet& tvalid, const NumberSet& aliasedLocals, const NumberSet& aliasedParams, int & spareTemps, const GrowingVariableArray& staticVars); void PerformValueForwarding(const GrowingInstructionPtrArray& tvalue, const ValueSet& values, FastNumberSet& tvalid, const NumberSet& aliasedLocals, const NumberSet& aliasedParams, int & spareTemps, const GrowingVariableArray& staticVars, const GrowingInterCodeProcedurePtrArray& staticProcs);
void PerformMachineSpecificValueUsageCheck(const GrowingInstructionPtrArray& tvalue, FastNumberSet& tvalid, const GrowingVariableArray& staticVars, FastNumberSet& fsingle); void PerformMachineSpecificValueUsageCheck(const GrowingInstructionPtrArray& tvalue, FastNumberSet& tvalid, const GrowingVariableArray& staticVars, const GrowingInterCodeProcedurePtrArray& staticProcs, FastNumberSet& fsingle);
bool EliminateDeadBranches(void); bool EliminateDeadBranches(void);
bool MergeIndexedLoadStore(const GrowingInstructionPtrArray& tvalue); bool MergeIndexedLoadStore(const GrowingInstructionPtrArray& tvalue);
@ -590,8 +590,8 @@ public:
bool CommonTailCodeMerge(void); bool CommonTailCodeMerge(void);
bool SplitSingleBranchUseConst(void); bool SplitSingleBranchUseConst(void);
void PeepholeOptimization(const GrowingVariableArray& staticVars); void PeepholeOptimization(const GrowingVariableArray& staticVars, const GrowingInterCodeProcedurePtrArray& staticProcs);
bool PeepholeReplaceOptimization(const GrowingVariableArray& staticVars); bool PeepholeReplaceOptimization(const GrowingVariableArray& staticVars, const GrowingInterCodeProcedurePtrArray& staticProcs);
bool MoveLoopHeadCheckToTail(void); bool MoveLoopHeadCheckToTail(void);
void SingleBlockLoopOptimisation(const NumberSet& aliasedParams, const GrowingVariableArray& staticVars); void SingleBlockLoopOptimisation(const NumberSet& aliasedParams, const GrowingVariableArray& staticVars);