Skip to content

Commit 346242f

Browse files
bcheng0127igcbot
authored andcommitted
LNV bug fix
Lvn bug fix
1 parent e5ba904 commit 346242f

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

visa/Passes/LVN.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,11 @@ bool LVN::canReplaceUses(INST_LIST_ITER inst_it, UseList &uses,
200200
break;
201201
}
202202

203+
if (opndNum == Opnd_pred || opndNum == Opnd_condMod) {
204+
canReplace = false;
205+
break;
206+
}
207+
203208
if (!bb->isAllLaneActive()) {
204209
auto defCoversUseEmask =
205210
defInst->getMaskOffset() <= useInst->getMaskOffset() &&
@@ -1430,6 +1435,10 @@ void LVN::addUse(G4_DstRegRegion *dst, G4_INST *use, unsigned int srcIndex) {
14301435
srcPos = Opnd_src1;
14311436
} else if (srcIndex == 2) {
14321437
srcPos = Opnd_src2;
1438+
} else if (srcIndex == 3) {
1439+
srcPos = Opnd_pred;
1440+
} else if (srcIndex == 4) {
1441+
srcPos = Opnd_condMod;
14331442
}
14341443

14351444
UseInfo useInst = {use, srcPos};
@@ -1443,6 +1452,10 @@ void LVN::addUse(G4_DstRegRegion *dst, G4_INST *use, unsigned int srcIndex) {
14431452
(*it).second.push_back(useInst);
14441453
}
14451454

1455+
if (srcIndex > 3) {
1456+
return;
1457+
}
1458+
14461459
auto srcOpnd = use->getSrc(srcIndex);
14471460
auto itUD = useDef.find(srcOpnd);
14481461
if (itUD == useDef.end()) {
@@ -1465,6 +1478,16 @@ void LVN::removeAddrTaken(G4_AddrExp *opnd) {
14651478
}
14661479
}
14671480

1481+
void LVN::removeFlag(G4_Declare *topDcl) {
1482+
auto range_it = activeDefs.equal_range(topDcl->getDeclId());
1483+
for (auto it = range_it.first; it != range_it.second;) {
1484+
auto prev_it = it;
1485+
(*prev_it).second.second->getInst()->removeAllUses();
1486+
it++;
1487+
activeDefs.erase(prev_it);
1488+
}
1489+
}
1490+
14681491
void LVN::populateDuTable(INST_LIST_ITER inst_it) {
14691492
duTablePopulated = true;
14701493
// Populate duTable from inst_it position
@@ -1612,6 +1635,48 @@ void LVN::populateDuTable(INST_LIST_ITER inst_it) {
16121635
}
16131636
}
16141637
}
1638+
G4_CondMod *condMod = curInst->getCondMod();
1639+
if (condMod && condMod->getBase() && condMod->getBase()->isRegVar()) {
1640+
G4_Declare *condDcl = condMod->getTopDcl();
1641+
if (condDcl && condDcl->getRegVar()->isFlag()) {
1642+
auto range_it = activeDefs.equal_range(condDcl->getDeclId());
1643+
if (range_it.first != range_it.second) {
1644+
auto start_it = range_it.second;
1645+
start_it--;
1646+
for (auto it = start_it;;) {
1647+
G4_DstRegRegion *activeDst = (*it).second.second;
1648+
addUse(activeDst, curInst, 4);
1649+
if (it == range_it.first) {
1650+
// Last match reached
1651+
break;
1652+
}
1653+
it--;
1654+
}
1655+
}
1656+
removeFlag(condDcl);
1657+
}
1658+
}
1659+
1660+
G4_Predicate *predicate = curInst->getPredicate();
1661+
if (predicate && predicate->getBase() && predicate->getBase()->isRegVar()) {
1662+
G4_Declare *predDcl = predicate->getTopDcl();
1663+
if (predDcl && predDcl->getRegVar()->isFlag()) {
1664+
auto range_it = activeDefs.equal_range(predDcl->getDeclId());
1665+
if (range_it.first != range_it.second) {
1666+
auto start_it = range_it.second;
1667+
start_it--;
1668+
for (auto it = start_it;;) {
1669+
G4_DstRegRegion *activeDst = (*it).second.second;
1670+
addUse(activeDst, curInst, 3);
1671+
if (it == range_it.first) {
1672+
// Last match reached
1673+
break;
1674+
}
1675+
it--;
1676+
}
1677+
}
1678+
}
1679+
}
16151680

16161681
inst_it++;
16171682
}

visa/Passes/LVN.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ class LVN {
120120

121121
void populateDuTable(INST_LIST_ITER inst_it);
122122
void removeAddrTaken(G4_AddrExp *opnd);
123+
void removeFlag(G4_Declare *topDck);
123124
void addUse(G4_DstRegRegion *dst, G4_INST *use, unsigned int srcIndex);
124125
void addValueToTable(G4_INST *inst, Value &oldValue);
125126
LVNItemInfo *isValueInTable(Value &value, bool negate);

0 commit comments

Comments
 (0)