[llvm] r273545 - [IfConversion] Bugfix: Don't use undef flag while adding use operands.
Peter Collingbourne via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 24 13:28:38 PDT 2016
Reproducer posted to https://llvm.org/bugs/show_bug.cgi?id=28295
Peter
On Fri, Jun 24, 2016 at 12:05 PM, Peter Collingbourne <peter at pcc.me.uk>
wrote:
> Hi Jonas,
>
> I reverted this in r273707 as it caused PR28295.
>
> I should have a reproducer for you soon.
>
> Thanks,
> Peter
>
> On Thu, Jun 23, 2016 at 1:13 AM, Jonas Paulsson via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: jonpa
>> Date: Thu Jun 23 03:13:20 2016
>> New Revision: 273545
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=273545&view=rev
>> Log:
>> [IfConversion] Bugfix: Don't use undef flag while adding use operands.
>>
>> IfConversion used to always add the undef flag when adding a use operand
>> on a newly predicated instruction. This would be an operand for the
>> register
>> being conditionally redefined. Due to the undef flag, the liveness of this
>> register prior to the predicated instruction would get lost.
>>
>> This patch changes this so that such use operands are added only when the
>> register is live, without the undef flag.
>>
>> Reviewed by Quentin Colombet.
>> http://reviews.llvm.org/D209077
>>
>> Modified:
>> llvm/trunk/lib/CodeGen/IfConversion.cpp
>>
>> Modified: llvm/trunk/lib/CodeGen/IfConversion.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/IfConversion.cpp?rev=273545&r1=273544&r2=273545&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/IfConversion.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/IfConversion.cpp Thu Jun 23 03:13:20 2016
>> @@ -1046,8 +1046,19 @@ void IfConverter::RemoveExtraEdges(BBInf
>> }
>>
>> /// 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 @@ static void UpdatePredRedefs(MachineInst
>> 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 @@ static void UpdatePredRedefs(MachineInst
>> 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);
>> }
>> }
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
>
>
> --
> --
> Peter
>
--
--
Peter
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160624/384d5d6f/attachment.html>
More information about the llvm-commits
mailing list