[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