@@ -367,7 +367,7 @@ namespace IGC
367
367
static bool isHoistable ( BinaryOperator* inst );
368
368
static bool isHoistableOverAnchor ( BinaryOperator* instToHoist, BinaryOperator* anchorInst );
369
369
Function& F;
370
- DenseMap<Value*, SmallVector<ShuffleGroup, 4 >> ShuffleGroupMap;
370
+ DenseMap<std::pair<BasicBlock*, Value*> , SmallVector<ShuffleGroup, 4 >> ShuffleGroupMap;
371
371
DenseSet<WaveShuffleIndexIntrinsic*> Visited;
372
372
};
373
373
@@ -451,7 +451,7 @@ bool WaveShuffleIndexSinkingImpl::splitWaveShuffleIndexes()
451
451
bool WaveShuffleIndexSinkingImpl::mergeWaveShuffleIndexes ()
452
452
{
453
453
// Map from Source to (Map from Lane to list of duplicate instructions)
454
- DenseMap<Value*, DenseMap<ConstantInt*, SmallVector<WaveShuffleIndexIntrinsic*>>> mergeMap;
454
+ DenseMap<std::pair<BasicBlock*, Value*> , DenseMap<ConstantInt*, SmallVector<WaveShuffleIndexIntrinsic*>>> mergeMap;
455
455
for ( auto & BB : F )
456
456
{
457
457
for ( auto & I : BB )
@@ -460,7 +460,7 @@ bool WaveShuffleIndexSinkingImpl::mergeWaveShuffleIndexes()
460
460
{
461
461
if ( auto * constantChannel = dyn_cast<ConstantInt>( waveShuffleInst->getChannel () ) )
462
462
{
463
- mergeMap[ waveShuffleInst->getSrc () ][ constantChannel ].push_back ( waveShuffleInst );
463
+ mergeMap[ {&BB, waveShuffleInst->getSrc ()} ][ constantChannel ].push_back ( waveShuffleInst );
464
464
}
465
465
}
466
466
}
@@ -505,11 +505,13 @@ void WaveShuffleIndexSinkingImpl::gatherShuffleGroups()
505
505
// Save compute and do not re-process/ create a new ShuffleGroup
506
506
continue ;
507
507
}
508
- if ( ShuffleGroupMap.count ( waveShuffleInst->getSrc () ) )
508
+
509
+ std::pair<BasicBlock*, Value*> bbShuffleGroup = { &BB, waveShuffleInst->getSrc () };
510
+ if ( ShuffleGroupMap.count ( bbShuffleGroup ) )
509
511
{
510
512
// Found existing group(s) with the same source, try to match with one of the groups
511
513
bool match = false ;
512
- for ( auto & shuffleGroup : ShuffleGroupMap[ waveShuffleInst-> getSrc () ] )
514
+ for ( auto & shuffleGroup : ShuffleGroupMap[ bbShuffleGroup ] )
513
515
{
514
516
if ( shuffleGroup.match ( waveShuffleInst ) )
515
517
{
@@ -521,13 +523,13 @@ void WaveShuffleIndexSinkingImpl::gatherShuffleGroups()
521
523
// create new ShuffleGroup since no suitable match was found
522
524
if ( !match )
523
525
{
524
- ShuffleGroupMap[ waveShuffleInst->getSrc () ].emplace_back ( waveShuffleInst );
526
+ ShuffleGroupMap[ {&BB, waveShuffleInst->getSrc ()} ].emplace_back ( waveShuffleInst );
525
527
}
526
528
}
527
529
else
528
530
{
529
531
// create new ShuffleGroup for broadcast operations
530
- ShuffleGroupMap[ waveShuffleInst->getSrc () ].emplace_back ( waveShuffleInst );
532
+ ShuffleGroupMap[ {&BB, waveShuffleInst->getSrc ()} ].emplace_back ( waveShuffleInst );
531
533
}
532
534
}
533
535
}
0 commit comments