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

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 20 08:51:53 PDT 2016


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
>


More information about the llvm-commits mailing list