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

Dale Johannesen dalej at apple.com
Mon Apr 12 16:22:13 PDT 2010


On Apr 12, 2010, at 4:13 PMPDT, Chris Lattner wrote:

> 
> 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

Branch folding is already trying:

    // If the prior block branches here on true and somewhere else on false, and
    // if the branch condition is reversible, reverse the branch to create a
    // fall-through.
    if (PriorTBB == MBB) {
      SmallVector<MachineOperand, 4> NewPriorCond(PriorCond);
      if (!TII->ReverseBranchCondition(NewPriorCond)) {
        TII->RemoveBranch(PrevBB);
        TII->InsertBranch(PrevBB, PriorFBB, 0, NewPriorCond);
        MadeChange = true;
        ++NumBranchOpts;
        goto ReoptimizeBlock;
      }
    }

Why doesn't it work in this case?

>> 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
> 
> 
> _______________________________________________
> 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