@@ -846,10 +846,12 @@ void BankConflictPass::setupBankConflictsforMad(G4_INST *inst) {
846
846
G4_Declare *dcls[3];
847
847
G4_Declare *opndDcls[3];
848
848
BankConflict assignedBank = BANK_CONFLICT_NONE; // Flip for next
849
+ bool fixedBank[3];
849
850
850
851
for (int i = 0; i < 3; i += 1) {
851
852
dcls[i] = nullptr;
852
853
opndDcls[i] = nullptr;
854
+ fixedBank[i] = false;
853
855
854
856
G4_Operand *src = inst->getSrc(i);
855
857
if (!src || !src->isSrcRegRegion() || src->isAreg()) {
@@ -863,6 +865,15 @@ void BankConflictPass::setupBankConflictsforMad(G4_INST *inst) {
863
865
gra.kernel.numEltPerGRF<Type_UB>();
864
866
srcBC[i] = gra.getBankConflict(dcls[i]);
865
867
868
+ if (dcls[i] && dcls[i]->getRegVar() &&
869
+ dcls[i]->getRegVar()->isPhyRegAssigned()) {
870
+ int regNum = dcls[i]->getRegVar()->getPhyReg()->asGreg()->getRegNum();
871
+ srcBC[i] = regNum % 2 ? BANK_CONFLICT_SECOND_HALF_ODD
872
+ : BANK_CONFLICT_FIRST_HALF_EVEN;
873
+ gra.setBankConflict(dcls[i], srcBC[i]);
874
+ fixedBank[i] = true;
875
+ }
876
+
866
877
if (srcBC[i] != BANK_CONFLICT_NONE) {
867
878
if (isOddOffset(offset[i])) {
868
879
if (srcBC[i] == BANK_CONFLICT_FIRST_HALF_EVEN) {
@@ -916,7 +927,7 @@ void BankConflictPass::setupBankConflictsforMad(G4_INST *inst) {
916
927
}
917
928
918
929
srcBC[i] = gra.getBankConflict(dcls[i]);
919
- if (srcBC[i] != BANK_CONFLICT_NONE) {
930
+ if (!fixedBank[i] && srcBC[i] != BANK_CONFLICT_NONE) {
920
931
if (isOddOffset(offset[i])) {
921
932
if (srcBC[i] == BANK_CONFLICT_FIRST_HALF_EVEN) {
922
933
srcBC[i] = BANK_CONFLICT_SECOND_HALF_ODD;
@@ -943,7 +954,7 @@ void BankConflictPass::setupBankConflictsforMad(G4_INST *inst) {
943
954
: BANK_CONFLICT_FIRST_HALF_EVEN;
944
955
}
945
956
gra.setBankConflict(dcls[i], srcBC[i]);
946
- } else {
957
+ } else if (!fixedBank[i]) {
947
958
srcBC[i] = (assignedBank == BANK_CONFLICT_FIRST_HALF_EVEN)
948
959
? BANK_CONFLICT_SECOND_HALF_ODD
949
960
: BANK_CONFLICT_FIRST_HALF_EVEN;
0 commit comments