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

Matthias Braun via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 19 18:29:51 PDT 2016


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