[llvm-commits] [llvm] r101075 - in /llvm/trunk: lib/Target/X86/X86InstrInfo.cpp test/CodeGen/X86/brcond.ll

Chris Lattner clattner at apple.com
Mon Apr 12 16:13:38 PDT 2010


On Apr 12, 2010, at 3:19 PM, Bill Wendling wrote:

> Author: void
> Date: Mon Apr 12 17:19:57 2010
> New Revision: 101075

hi Bill, is it possible for this to go in target independent code, e.g. branch folding?

-Chris

> 
> URL: http://llvm.org/viewvc/llvm-project?rev=101075&view=rev
> Log:
> Micro-optimization:
> 
> If we have this situation:
> 
>    jCC  L1
>    jmp  L2
> L1:
>  ...
> L2:
>  ...
> 
> We can get a small performance boost by emitting this instead:
> 
>    jnCC L2
> L1:
>  ...
> L2:
>  ...
> 
> This testcase shows an example of this:
> 
> float func(float x, float y) {
>    double product = (double)x * y;
>    if (product == 0.0)
>        return product;
>    return product - 1.0;
> }
> 
> 
> Modified:
>    llvm/trunk/lib/Target/X86/X86InstrInfo.cpp
>    llvm/trunk/test/CodeGen/X86/brcond.ll
> 
> Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.cpp?rev=101075&r1=101074&r2=101075&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86InstrInfo.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Mon Apr 12 17:19:57 2010
> @@ -1684,6 +1684,7 @@
>   // Start from the bottom of the block and work up, examining the
>   // terminator instructions.
>   MachineBasicBlock::iterator I = MBB.end();
> +  MachineBasicBlock::iterator UnCondBrIter = MBB.end();
>   while (I != MBB.begin()) {
>     --I;
>     if (I->isDebugValue())
> @@ -1701,6 +1702,8 @@
> 
>     // Handle unconditional branches.
>     if (I->getOpcode() == X86::JMP_4) {
> +      UnCondBrIter = I;
> +
>       if (!AllowModify) {
>         TBB = I->getOperand(0).getMBB();
>         continue;
> @@ -1718,10 +1721,11 @@
>         TBB = 0;
>         I->eraseFromParent();
>         I = MBB.end();
> +        UnCondBrIter = MBB.end();
>         continue;
>       }
> 
> -      // TBB is used to indicate the unconditinal destination.
> +      // TBB is used to indicate the unconditional destination.
>       TBB = I->getOperand(0).getMBB();
>       continue;
>     }
> @@ -1733,7 +1737,48 @@
> 
>     // Working from the bottom, handle the first conditional branch.
>     if (Cond.empty()) {
> +      MachineBasicBlock *TargetBB = I->getOperand(0).getMBB();
> +      if (AllowModify && UnCondBrIter != MBB.end() &&
> +          MBB.isLayoutSuccessor(TargetBB)) {
> +        // If we can modify the code and it ends in something like:
> +        //
> +        //     jCC L1
> +        //     jmp L2
> +        //   L1:
> +        //     ...
> +        //   L2:
> +        //
> +        // Then we can change this to:
> +        //
> +        //     jnCC L2
> +        //   L1:
> +        //     ...
> +        //   L2:
> +        //
> +        // Which is a bit more efficient.
> +        // We conditionally jump to the fall-through block.
> +        BranchCode = GetOppositeBranchCondition(BranchCode);
> +        unsigned JNCC = GetCondBranchFromCond(BranchCode);
> +        MachineBasicBlock::iterator OldInst = I;
> +        --I;
> +
> +        BuildMI(MBB, UnCondBrIter, MBB.findDebugLoc(I), get(JNCC))
> +          .addMBB(UnCondBrIter->getOperand(0).getMBB());
> +        BuildMI(MBB, UnCondBrIter, MBB.findDebugLoc(I), get(X86::JMP_4))
> +          .addMBB(TargetBB);
> +        MBB.addSuccessor(TargetBB);
> +
> +        OldInst->eraseFromParent();
> +        UnCondBrIter->eraseFromParent();
> +
> +        // Restart the analysis.
> +        UnCondBrIter = MBB.end();
> +        I = MBB.end();
> +        continue;
> +      }
> +
>       FBB = TBB;
> +      TBB = TargetBB;
>       TBB = I->getOperand(0).getMBB();
>       Cond.push_back(MachineOperand::CreateImm(BranchCode));
>       continue;
> 
> Modified: llvm/trunk/test/CodeGen/X86/brcond.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/brcond.ll?rev=101075&r1=101074&r2=101075&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/brcond.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/brcond.ll Mon Apr 12 17:19:57 2010
> @@ -67,3 +67,41 @@
> ; CHECK-NEXT:	orl	8(%esp), %eax
> ; CHECK-NEXT:	je	LBB3_2
> }
> +
> +; <rdar://problem/7598384>:
> +;
> +;    jCC  L1
> +;    jmp  L2
> +; L1:
> +;   ...
> +; L2:
> +;   ...
> +;
> +; to:
> +; 
> +;    jnCC L2
> +; L1:
> +;   ...
> +; L2:
> +;   ...
> +define float @test4(float %x, float %y) nounwind readnone optsize ssp {
> +entry:
> +  %0 = fpext float %x to double                   ; <double> [#uses=1]
> +  %1 = fpext float %y to double                   ; <double> [#uses=1]
> +  %2 = fmul double %0, %1                         ; <double> [#uses=3]
> +  %3 = fcmp oeq double %2, 0.000000e+00           ; <i1> [#uses=1]
> +  br i1 %3, label %bb2, label %bb1
> +
> +; CHECK:      jne
> +; CHECK-NOT:  jmp
> +; CHECK-NEXT: jnp
> +
> +bb1:                                              ; preds = %entry
> +  %4 = fadd double %2, -1.000000e+00              ; <double> [#uses=1]
> +  br label %bb2
> +
> +bb2:                                              ; preds = %entry, %bb1
> +  %.0.in = phi double [ %4, %bb1 ], [ %2, %entry ] ; <double> [#uses=1]
> +  %.0 = fptrunc double %.0.in to float            ; <float> [#uses=1]
> +  ret float %.0
> +}
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list