[llvm-commits] [llvm] r161409 - in /llvm/trunk: lib/CodeGen/MachineBlockPlacement.cpp test/CodeGen/X86/2008-10-27-CoalescerBug.ll test/CodeGen/X86/block-placement.ll test/CodeGen/X86/loop-blocks.ll test/Transforms/LoopStrengthReduce/X86/2012-01-13-phielim.ll
Benjamin Kramer
benny.kra at gmail.com
Sat Aug 11 10:11:33 PDT 2012
On 07.08.2012, at 11:45, Chandler Carruth <chandlerc at gmail.com> wrote:
> Author: chandlerc
> Date: Tue Aug 7 04:45:24 2012
> New Revision: 161409
>
> URL: http://llvm.org/viewvc/llvm-project?rev=161409&view=rev
> Log:
> Add a much more conservative strategy for aligning branch targets.
> Previously, MBP essentially aligned every branch target it could. This
> bloats code quite a bit, especially non-looping code which has no real
> reason to prefer aligned branch targets so heavily.
>
> As Andy said in review, it's still a bit odd to do this without a real
> cost model, but this at least has much more plausible heuristics.
>
> Fixes PR13265.
There seem to be some regressions on the perf mini, can you take a look? I've seen some hot loops that are no longer aligned :(
http://llvm.org/perf/db_default/v4/nts/2707
- Ben
>
> Modified:
> llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp
> llvm/trunk/test/CodeGen/X86/2008-10-27-CoalescerBug.ll
> llvm/trunk/test/CodeGen/X86/block-placement.ll
> llvm/trunk/test/CodeGen/X86/loop-blocks.ll
> llvm/trunk/test/Transforms/LoopStrengthReduce/X86/2012-01-13-phielim.ll
>
> Modified: llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp?rev=161409&r1=161408&r2=161409&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp (original)
> +++ llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp Tue Aug 7 04:45:24 2012
> @@ -1011,29 +1011,63 @@
>
> // Walk through the backedges of the function now that we have fully laid out
> // the basic blocks and align the destination of each backedge. We don't rely
> - // on the loop info here so that we can align backedges in unnatural CFGs and
> - // backedges that were introduced purely because of the loop rotations done
> - // during this layout pass.
> - // FIXME: This isn't quite right, we shouldn't align backedges that result
> - // from blocks being sunken below the exit block for the function.
> + // exclusively on the loop info here so that we can align backedges in
> + // unnatural CFGs and backedges that were introduced purely because of the
> + // loop rotations done during this layout pass.
> if (F.getFunction()->hasFnAttr(Attribute::OptimizeForSize))
> return;
> unsigned Align = TLI->getPrefLoopAlignment();
> if (!Align)
> return; // Don't care about loop alignment.
> + if (FunctionChain.begin() == FunctionChain.end())
> + return; // Empty chain.
>
> - SmallPtrSet<MachineBasicBlock *, 16> PreviousBlocks;
> - for (BlockChain::iterator BI = FunctionChain.begin(),
> + const BranchProbability ColdProb(1, 5); // 20%
> + BlockFrequency EntryFreq = MBFI->getBlockFreq(F.begin());
> + BlockFrequency WeightedEntryFreq = EntryFreq * ColdProb;
> + for (BlockChain::iterator BI = llvm::next(FunctionChain.begin()),
> BE = FunctionChain.end();
> BI != BE; ++BI) {
> - PreviousBlocks.insert(*BI);
> - // Set alignment on the destination of all the back edges in the new
> - // ordering.
> - for (MachineBasicBlock::succ_iterator SI = (*BI)->succ_begin(),
> - SE = (*BI)->succ_end();
> - SI != SE; ++SI)
> - if (PreviousBlocks.count(*SI))
> - (*SI)->setAlignment(Align);
> + // Don't align non-looping basic blocks. These are unlikely to execute
> + // enough times to matter in practice. Note that we'll still handle
> + // unnatural CFGs inside of a natural outer loop (the common case) and
> + // rotated loops.
> + MachineLoop *L = MLI->getLoopFor(*BI);
> + if (!L)
> + continue;
> +
> + // If the block is cold relative to the function entry don't waste space
> + // aligning it.
> + BlockFrequency Freq = MBFI->getBlockFreq(*BI);
> + if (Freq < WeightedEntryFreq)
> + continue;
> +
> + // If the block is cold relative to its loop header, don't align it
> + // regardless of what edges into the block exist.
> + MachineBasicBlock *LoopHeader = L->getHeader();
> + BlockFrequency LoopHeaderFreq = MBFI->getBlockFreq(LoopHeader);
> + if (Freq < (LoopHeaderFreq * ColdProb))
> + continue;
> +
> + // Check for the existence of a non-layout predecessor which would benefit
> + // from aligning this block.
> + MachineBasicBlock *LayoutPred = *llvm::prior(BI);
> +
> + // Force alignment if all the predecessors are jumps. We already checked
> + // that the block isn't cold above.
> + if (!LayoutPred->isSuccessor(*BI)) {
> + (*BI)->setAlignment(Align);
> + continue;
> + }
> +
> + // Align this block if the layout predecessor's edge into this block is
> + // cold relative to the block. When this is true, othe predecessors make up
> + // all of the hot entries into the block and thus alignment is likely to be
> + // important.
> + BranchProbability LayoutProb = MBPI->getEdgeProbability(LayoutPred, *BI);
> + BlockFrequency LayoutEdgeFreq = MBFI->getBlockFreq(LayoutPred) * LayoutProb;
> + if (LayoutEdgeFreq <= (Freq * ColdProb))
> + (*BI)->setAlignment(Align);
> }
> }
>
>
> Modified: llvm/trunk/test/CodeGen/X86/2008-10-27-CoalescerBug.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2008-10-27-CoalescerBug.ll?rev=161409&r1=161408&r2=161409&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/2008-10-27-CoalescerBug.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/2008-10-27-CoalescerBug.ll Tue Aug 7 04:45:24 2012
> @@ -17,8 +17,7 @@
> ; CHECK: %bb30.loopexit
> ; CHECK: divsd %xmm0
> ; CHECK: movsd %xmm0, 16(%esp)
> -; CHECK: .align
> -; CHECK-NEXT: %bb3
> +; CHECK: %bb3
> bb3: ; preds = %bb30.loopexit, %bb25, %bb3
> %2 = load i32* null, align 4 ; <i32> [#uses=1]
> %3 = mul i32 %2, 0 ; <i32> [#uses=1]
>
> Modified: llvm/trunk/test/CodeGen/X86/block-placement.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/block-placement.ll?rev=161409&r1=161408&r2=161409&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/block-placement.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/block-placement.ll Tue Aug 7 04:45:24 2012
> @@ -7,10 +7,15 @@
> ; that is not expected to run.
> ; CHECK: test_ifchains:
> ; CHECK: %entry
> +; CHECK-NOT: .align
> ; CHECK: %else1
> +; CHECK-NOT: .align
> ; CHECK: %else2
> +; CHECK-NOT: .align
> ; CHECK: %else3
> +; CHECK-NOT: .align
> ; CHECK: %else4
> +; CHECK-NOT: .align
> ; CHECK: %exit
> ; CHECK: %then1
> ; CHECK: %then2
> @@ -76,8 +81,11 @@
> ; Check that we sink cold loop blocks after the hot loop body.
> ; CHECK: test_loop_cold_blocks:
> ; CHECK: %entry
> +; CHECK-NOT: .align
> ; CHECK: %unlikely1
> +; CHECK-NOT: .align
> ; CHECK: %unlikely2
> +; CHECK: .align
> ; CHECK: %body1
> ; CHECK: %body2
> ; CHECK: %body3
>
> Modified: llvm/trunk/test/CodeGen/X86/loop-blocks.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/loop-blocks.ll?rev=161409&r1=161408&r2=161409&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/loop-blocks.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/loop-blocks.ll Tue Aug 7 04:45:24 2012
> @@ -41,7 +41,6 @@
> ; CHECK-NEXT: align
> ; CHECK-NEXT: .LBB1_4:
> ; CHECK-NEXT: callq bar99
> -; CHECK-NEXT: align
> ; CHECK-NEXT: .LBB1_1:
> ; CHECK-NEXT: callq body
>
> @@ -79,7 +78,6 @@
> ; CHECK-NEXT: .LBB2_5:
> ; CHECK-NEXT: callq block_a_true_func
> ; CHECK-NEXT: callq block_a_merge_func
> -; CHECK-NEXT: align
> ; CHECK-NEXT: .LBB2_1:
> ; CHECK-NEXT: callq body
> ;
> @@ -139,13 +137,13 @@
> ; CHECK-NEXT: align
> ; CHECK-NEXT: .LBB3_7:
> ; CHECK-NEXT: callq bar100
> -; CHECK-NEXT: align
> ; CHECK-NEXT: .LBB3_1:
> ; CHECK-NEXT: callq loop_header
> ; CHECK: jl .LBB3_7
> ; CHECK: jge .LBB3_3
> ; CHECK-NEXT: callq bar101
> ; CHECK-NEXT: jmp .LBB3_1
> +; CHECK-NEXT: align
> ; CHECK-NEXT: .LBB3_3:
> ; CHECK: jge .LBB3_4
> ; CHECK-NEXT: callq bar102
>
> Modified: llvm/trunk/test/Transforms/LoopStrengthReduce/X86/2012-01-13-phielim.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopStrengthReduce/X86/2012-01-13-phielim.ll?rev=161409&r1=161408&r2=161409&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/LoopStrengthReduce/X86/2012-01-13-phielim.ll (original)
> +++ llvm/trunk/test/Transforms/LoopStrengthReduce/X86/2012-01-13-phielim.ll Tue Aug 7 04:45:24 2012
> @@ -99,7 +99,6 @@
> ; CHECK: %for.body3.lr.ph.us.i.loopexit
> ; CHECK-NEXT: in Loop: Header
> ; CHECK-NEXT: incq
> -; CHECK-NEXT: .align
> ; CHECK-NEXT: %for.body3.us.i
> ; CHECK-NEXT: Inner Loop
> ; CHECK: testb
>
>
> _______________________________________________
> 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