Skip to content

Commit dce34c1

Browse files
author
Martien de Jong
committed
Better test for sideeffect-free:
Check for live lanes of superregisters
1 parent 529f770 commit dce34c1

1 file changed

Lines changed: 15 additions & 6 deletions

File tree

llvm/lib/Target/AIE/AIEPostPipeliner.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -190,13 +190,22 @@ bool isSideEffectFree(MachineInstr *MI) {
190190
// state and is thus not side effect free.
191191
const auto &TRI = static_cast<const AIEBaseRegisterInfo &>(
192192
*MI->getMF()->getSubtarget().getRegisterInfo());
193-
for (const MachineOperand &Def : MI->defs()) {
194-
if (Def.isReg() && TRI.isFifoPhysReg(Def.getReg()))
195-
return false;
196-
}
197193

198-
return !any_of(MI->defs(), [MBB = MI->getParent()](MachineOperand &Def) {
199-
return MBB->isLiveIn(Def.getReg());
194+
return !any_of(MI->defs(), [MBB = MI->getParent(),
195+
&TRI](MachineOperand &Def) {
196+
Register Reg = Def.getReg();
197+
unsigned SubReg = Def.getSubReg();
198+
// Get the lane mask for the def operand: if it has a subreg, use that
199+
// subreg's lane mask; otherwise assume all lanes are defined.
200+
LaneBitmask DefLaneMask =
201+
SubReg ? TRI.getSubRegIndexLaneMask(SubReg) : LaneBitmask::getAll();
202+
return any_of(MBB->getLiveIns(),
203+
[Reg, DefLaneMask,
204+
&TRI](const MachineBasicBlock::RegisterMaskPair &LiveIn) {
205+
// Check if registers overlap AND the lane masks intersect.
206+
return TRI.regsOverlap(Reg, LiveIn.PhysReg) &&
207+
(DefLaneMask & LiveIn.LaneMask).any();
208+
});
200209
});
201210
}
202211

0 commit comments

Comments
 (0)