@@ -2081,7 +2081,7 @@ G4_INST* SWSB::insertSyncAllWRInstruction(G4_BB* bb, unsigned int SBIDs, INST_LI
2081
2081
return syncInst;
2082
2082
}
2083
2083
2084
- void SWSB::insertSyncToken (G4_BB* bb, SBNode* node, G4_INST* inst, INST_LIST_ITER inst_it, int newInstID, BitSet* dstTokens, BitSet* srcTokens, bool removeAllToken)
2084
+ bool SWSB::insertSyncToken (G4_BB * bb, SBNode * node, G4_INST * inst, INST_LIST_ITER inst_it, int newInstID, BitSet * dstTokens, BitSet * srcTokens, bool removeAllToken)
2085
2085
{
2086
2086
// Non-test instruction can only have
2087
2087
// 1. non-send: one Dst Token with distance, or
@@ -2097,6 +2097,8 @@ void SWSB::insertSyncToken(G4_BB* bb, SBNode* node, G4_INST* inst, INST_LIST_ITE
2097
2097
unsigned short dstToken = (unsigned short )-1 ;
2098
2098
unsigned short srcToken = (unsigned short )-1 ;
2099
2099
SWSBTokenType type = G4_INST::SWSBTokenType::TOKEN_NONE;
2100
+ bool insertedSync = false ;
2101
+
2100
2102
for (unsigned int i = 0 ; i < node->GetInstruction ()->getDepTokenNum ();)
2101
2103
{
2102
2104
G4_INST* synAllInst = nullptr ;
@@ -2212,6 +2214,7 @@ void SWSB::insertSyncToken(G4_BB* bb, SBNode* node, G4_INST* inst, INST_LIST_ITE
2212
2214
synInst->setDepToken (dstToken, SWSBTokenType::AFTER_WRITE);
2213
2215
}
2214
2216
synInst->setLexicalId (newInstID);
2217
+ insertedSync = true ;
2215
2218
}
2216
2219
2217
2220
if (src)
@@ -2230,23 +2233,31 @@ void SWSB::insertSyncToken(G4_BB* bb, SBNode* node, G4_INST* inst, INST_LIST_ITE
2230
2233
synInst->setDepToken (srcToken, SWSBTokenType::AFTER_READ);
2231
2234
}
2232
2235
synInst->setLexicalId (newInstID);
2236
+ insertedSync = true ;
2233
2237
}
2234
2238
2235
- return ;
2239
+ return insertedSync ;
2236
2240
}
2237
2241
2238
2242
2239
2243
void SWSB::insertSync (G4_BB* bb, SBNode* node, G4_INST* inst, INST_LIST_ITER inst_it, int newInstID, BitSet* dstTokens, BitSet* srcTokens, bool hasDistOneAreg)
2240
2244
{
2241
- G4_INST* syncInst = nullptr ;
2245
+ bool insertedSync = false ;
2246
+ INST_LIST_ITER prevIt = inst_it;
2242
2247
if (hasDistOneAreg)
2243
2248
{
2244
- syncInst = insertSyncInstructionAfter (bb, inst_it, inst->getCISAOff (), inst->getLineNo ());
2245
- syncInst->setDistance (1 );
2249
+ prevIt--;
2250
+ }
2251
+
2252
+ {
2253
+ insertedSync = insertSyncToken (bb, node, inst, inst_it, newInstID, dstTokens, srcTokens, false );
2246
2254
}
2247
2255
2256
+ if (hasDistOneAreg && insertedSync)
2248
2257
{
2249
- insertSyncToken (bb, node, inst, inst_it, newInstID, dstTokens, srcTokens, false );
2258
+ G4_INST* syncInst = nullptr ;
2259
+ syncInst = insertSyncInstructionAfter (bb, prevIt, inst->getCISAOff (), inst->getLineNo ());
2260
+ syncInst->setDistance (1 );
2250
2261
}
2251
2262
}
2252
2263
@@ -3348,6 +3359,7 @@ void G4_BB_SB::SBDDD(G4_BB* bb,
3348
3359
if (hasFollowDistOneAReg)
3349
3360
{
3350
3361
node->setDistance (1 );
3362
+ node->setDistOneAReg ();
3351
3363
hasFollowDistOneAReg = false ;
3352
3364
}
3353
3365
@@ -3357,8 +3369,6 @@ void G4_BB_SB::SBDDD(G4_BB* bb,
3357
3369
if (hasFollowDistOneAReg)
3358
3370
{
3359
3371
node->setDistance (1 );
3360
- node->setDistOneAReg ();
3361
-
3362
3372
}
3363
3373
3364
3374
0 commit comments