@@ -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+
14681491void 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 }
0 commit comments