[llvm] r281957 - BranchFolder: Fix invalid undef flags after merge.

Matthias Braun via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 20 10:08:34 PDT 2016


Ah, found the mail explaining the 3.9.1 process now, thanks.

- Matthias

> On Sep 20, 2016, at 8:51 AM, Hans Wennborg via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> Tom is managing the 3.9.1 release. I believe he wants merge requests
> as PR's filed as blockers on PR30261.
> 
> Thanks,
> Hans
> 
> On Mon, Sep 19, 2016 at 6:29 PM, Matthias Braun <mbraun at apple.com> wrote:
>> I'd like to nominate this fix for the 3.9.1 release.
>> 
>> - Matthias
>> 
>>> On Sep 19, 2016, at 6:14 PM, Matthias Braun via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>>> 
>>> Author: matze
>>> Date: Mon Sep 19 20:14:42 2016
>>> New Revision: 281957
>>> 
>>> URL: http://llvm.org/viewvc/llvm-project?rev=281957&view=rev
>>> Log:
>>> BranchFolder: Fix invalid undef flags after merge.
>>> 
>>> It is legal to merge instructions with different undef flags; However we
>>> must drop the undef flag from the merged instruction if it isn't present
>>> everywhere.
>>> 
>>> This fixes http://llvm.org/PR30199
>>> 
>>> Added:
>>> llvm/trunk/test/CodeGen/X86/branchfolding-undef.mir
>>> Modified:
>>> llvm/trunk/lib/CodeGen/BranchFolding.cpp
>>> 
>>> Modified: llvm/trunk/lib/CodeGen/BranchFolding.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/BranchFolding.cpp?rev=281957&r1=281956&r2=281957&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/lib/CodeGen/BranchFolding.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/BranchFolding.cpp Mon Sep 19 20:14:42 2016
>>> @@ -801,9 +801,8 @@ bool BranchFolder::CreateCommonTailOnlyB
>>> }
>>> 
>>> static void
>>> -mergeMMOsFromMemoryOperations(MachineBasicBlock::iterator MBBIStartPos,
>>> -                              MachineBasicBlock &MBBCommon) {
>>> -  // Merge MMOs from memory operations in the common block.
>>> +mergeOperations(MachineBasicBlock::iterator MBBIStartPos,
>>> +                MachineBasicBlock &MBBCommon) {
>>> MachineBasicBlock *MBB = MBBIStartPos->getParent();
>>> // Note CommonTailLen does not necessarily matches the size of
>>> // the common BB nor all its instructions because of debug
>>> @@ -833,8 +832,18 @@ mergeMMOsFromMemoryOperations(MachineBas
>>>        "Reached BB end within common tail length!");
>>> assert(MBBICommon->isIdenticalTo(*MBBI) && "Expected matching MIIs!");
>>> 
>>> +    // Merge MMOs from memory operations in the common block.
>>> if (MBBICommon->mayLoad() || MBBICommon->mayStore())
>>>   MBBICommon->setMemRefs(MBBICommon->mergeMemRefsWith(*MBBI));
>>> +    // Drop undef flags if they aren't present in all merged instructions.
>>> +    for (unsigned I = 0, E = MBBICommon->getNumOperands(); I != E; ++I) {
>>> +      MachineOperand &MO = MBBICommon->getOperand(I);
>>> +      if (MO.isReg() && MO.isUndef()) {
>>> +        const MachineOperand &OtherMO = MBBI->getOperand(I);
>>> +        if (!OtherMO.isUndef())
>>> +          MO.setIsUndef(false);
>>> +      }
>>> +    }
>>> 
>>> ++MBBI;
>>> ++MBBICommon;
>>> @@ -952,8 +961,8 @@ bool BranchFolder::TryTailMergeBlocks(Ma
>>>     continue;
>>>   DEBUG(dbgs() << "BB#" << SameTails[i].getBlock()->getNumber()
>>>                << (i == e-1 ? "" : ", "));
>>> -      // Merge MMOs from memory operations as needed.
>>> -      mergeMMOsFromMemoryOperations(SameTails[i].getTailStartPos(), *MBB);
>>> +      // Merge operations (MMOs, undef flags)
>>> +      mergeOperations(SameTails[i].getTailStartPos(), *MBB);
>>>   // Hack the end off BB i, making it jump to BB commonTailIndex instead.
>>>   ReplaceTailWithBranchTo(SameTails[i].getTailStartPos(), MBB);
>>>   // BB i is no longer a predecessor of SuccBB; remove it from the worklist.
>>> 
>>> Added: llvm/trunk/test/CodeGen/X86/branchfolding-undef.mir
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/branchfolding-undef.mir?rev=281957&view=auto
>>> ==============================================================================
>>> --- llvm/trunk/test/CodeGen/X86/branchfolding-undef.mir (added)
>>> +++ llvm/trunk/test/CodeGen/X86/branchfolding-undef.mir Mon Sep 19 20:14:42 2016
>>> @@ -0,0 +1,29 @@
>>> +# RUN: llc -o - %s -march=x86 -run-pass branch-folder | FileCheck %s
>>> +# Test that tail merging drops undef flags that aren't present on all
>>> +# instructions to be merged.
>>> +--- |
>>> +  define void @func() { ret void }
>>> +...
>>> +---
>>> +# CHECK-LABEL: name: func
>>> +# CHECK: bb.1:
>>> +# CHECK: %eax = MOV32ri 2
>>> +# CHECK-NOT: RET
>>> +# CHECK: bb.2:
>>> +# CHECK-NOT: RET 0, undef %eax
>>> +# CHECK: RET 0, %eax
>>> +name: func
>>> +tracksRegLiveness: true
>>> +body: |
>>> +  bb.0:
>>> +    successors: %bb.1, %bb.2
>>> +    JE_1 %bb.1, implicit undef %eflags
>>> +    JMP_1 %bb.2
>>> +
>>> +  bb.1:
>>> +    %eax = MOV32ri 2
>>> +    RET 0, %eax
>>> +
>>> +  bb.2:
>>> +    RET 0, undef %eax
>>> +...
>>> 
>>> 
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list