[PATCH] D20907: [IfConversion] Bugfix: don't add Undef flag on use if reg is live.
Jonas Paulsson via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 22 01:11:10 PDT 2016
jonpa updated this revision to Diff 61512.
jonpa added a comment.
> Given that we want the liveness to remain out of the business of the predication, I believe the proper fix is to set implicit use for all live variables. I.e., move your test on the setting of the implicit use, not in the undef flag.
I updated the patch according to your suggestion, so that the behaviour is simply to add an implicit-use operand of the reg (only) if it is live.
http://reviews.llvm.org/D20907
Files:
lib/CodeGen/IfConversion.cpp
Index: lib/CodeGen/IfConversion.cpp
===================================================================
--- lib/CodeGen/IfConversion.cpp
+++ lib/CodeGen/IfConversion.cpp
@@ -1046,8 +1046,19 @@
}
/// Behaves like LiveRegUnits::StepForward() but also adds implicit uses to all
-/// values defined in MI which are not live/used by MI.
+/// values defined in MI which are also live/used by MI.
static void UpdatePredRedefs(MachineInstr &MI, LivePhysRegs &Redefs) {
+ const TargetRegisterInfo *TRI = MI.getParent()->getParent()
+ ->getSubtarget().getRegisterInfo();
+
+ // Before stepping forward past MI, remember which regs were live
+ // before MI. This is needed to set the Undef flag only when reg is
+ // dead.
+ SparseSet<unsigned> LiveBeforeMI;
+ LiveBeforeMI.setUniverse(TRI->getNumRegs());
+ for (auto &Reg : Redefs)
+ LiveBeforeMI.insert(Reg);
+
SmallVector<std::pair<unsigned, const MachineOperand*>, 4> Clobbers;
Redefs.stepForward(MI, Clobbers);
@@ -1061,7 +1072,8 @@
if (Op.isRegMask()) {
// First handle regmasks. They clobber any entries in the mask which
// means that we need a def for those registers.
- MIB.addReg(Reg.first, RegState::Implicit | RegState::Undef);
+ if (LiveBeforeMI.count(Reg.first))
+ MIB.addReg(Reg.first, RegState::Implicit);
// We also need to add an implicit def of this register for the later
// use to read from.
@@ -1078,7 +1090,8 @@
if (Redefs.contains(Op.getReg()))
Op.setIsDead(false);
}
- MIB.addReg(Reg.first, RegState::Implicit | RegState::Undef);
+ if (LiveBeforeMI.count(Reg.first))
+ MIB.addReg(Reg.first, RegState::Implicit);
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D20907.61512.patch
Type: text/x-patch
Size: 1698 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160622/afe17396/attachment-0001.bin>
More information about the llvm-commits
mailing list