mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 02:33:06 +01:00
LiveIntervalAnalysis: findLastUseBefore() must ignore undef uses.
undef uses are no real uses of a register and must be ignored by findLastUseBefore() so that handleMove() does not produce invalid live intervals in some cases. This fixed http://llvm.org/PR28083 llvm-svn: 272446
This commit is contained in:
parent
e53140dc9d
commit
fe41256f69
@ -1314,6 +1314,8 @@ private:
|
||||
if (TargetRegisterInfo::isVirtualRegister(Reg)) {
|
||||
SlotIndex LastUse = Before;
|
||||
for (MachineOperand &MO : MRI.use_nodbg_operands(Reg)) {
|
||||
if (MO.isUndef())
|
||||
continue;
|
||||
unsigned SubReg = MO.getSubReg();
|
||||
if (SubReg != 0 && LaneMask != 0
|
||||
&& (TRI.getSubRegIndexLaneMask(SubReg) & LaneMask) == 0)
|
||||
@ -1353,7 +1355,7 @@ private:
|
||||
|
||||
// Check if MII uses Reg.
|
||||
for (MIBundleOperands MO(*MII); MO.isValid(); ++MO)
|
||||
if (MO->isReg() &&
|
||||
if (MO->isReg() && !MO->isUndef() &&
|
||||
TargetRegisterInfo::isPhysicalRegister(MO->getReg()) &&
|
||||
TRI.hasRegUnit(MO->getReg(), Reg))
|
||||
return Idx.getRegSlot();
|
||||
|
@ -329,6 +329,30 @@ TEST(LiveIntervalTest, MoveUpValNos) {
|
||||
});
|
||||
}
|
||||
|
||||
TEST(LiveIntervalTest, MoveOverUndefUse0) {
|
||||
// findLastUseBefore() used by handleMoveUp() must ignore undef operands.
|
||||
liveIntervalTest(
|
||||
" %0 = IMPLICIT_DEF\n"
|
||||
" NOOP\n"
|
||||
" NOOP implicit undef %0\n"
|
||||
" %0 = IMPLICIT_DEF implicit %0(tied-def 0)\n",
|
||||
[](MachineFunction &MF, LiveIntervals &LIS) {
|
||||
testHandleMove(MF, LIS, 3, 1);
|
||||
});
|
||||
}
|
||||
|
||||
TEST(LiveIntervalTest, MoveOverUndefUse1) {
|
||||
// findLastUseBefore() used by handleMoveUp() must ignore undef operands.
|
||||
liveIntervalTest(
|
||||
" %rax = IMPLICIT_DEF\n"
|
||||
" NOOP\n"
|
||||
" NOOP implicit undef %rax\n"
|
||||
" %rax = IMPLICIT_DEF implicit %rax(tied-def 0)\n",
|
||||
[](MachineFunction &MF, LiveIntervals &LIS) {
|
||||
testHandleMove(MF, LIS, 3, 1);
|
||||
});
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
::testing::InitGoogleTest(&argc, argv);
|
||||
initLLVM();
|
||||
|
Loading…
Reference in New Issue
Block a user