Add a flag to align all basic blocks in the function.

When debugging performance regressions we often ask ourselves if the regression
that we see is due to poor isel/sched/ra or due to some micro-architetural
problem.  When comparing two code sequences one good way to rule out front-end
bottlenecks (and other the issues) is to force code alignment. This pass adds
a flag that forces the alignment of all of the basic blocks in the program.

llvm-svn: 179353
This commit is contained in:
Nadav Rotem 2013-04-12 00:48:32 +00:00
parent 73b75e01bf
commit c3b0f50ac2
2 changed files with 36 additions and 0 deletions

View File

@ -39,6 +39,7 @@
#include "llvm/CodeGen/MachineLoopInfo.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/Support/Allocator.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetLowering.h"
@ -52,6 +53,11 @@ STATISTIC(CondBranchTakenFreq,
STATISTIC(UncondBranchTakenFreq,
"Potential frequency of taking unconditional branches");
static cl::opt<unsigned> AlignAllBlock("align-all-blocks",
cl::desc("Force the alignment of all "
"blocks in the function."),
cl::init(0), cl::Hidden);
namespace {
class BlockChain;
/// \brief Type for our function-wide basic block -> block chain mapping.
@ -1083,6 +1089,14 @@ bool MachineBlockPlacement::runOnMachineFunction(MachineFunction &F) {
TLI = F.getTarget().getTargetLowering();
assert(BlockToChain.empty());
if (AlignAllBlock) {
// Align all of the blocks in the function to a specific alignment.
for (MachineFunction::iterator FI = F.begin(), FE = F.end();
FI != FE; ++FI)
FI->setAlignment(AlignAllBlock);
return true;
}
buildCFGChains(F);
BlockToChain.clear();

View File

@ -0,0 +1,22 @@
; RUN: llc -march=x86 -align-all-blocks=16 < %s | FileCheck %s
;CHECK: foo
;CHECK: .align 16, 0x90
;CHECK: .align 16, 0x90
;CHECK: .align 16, 0x90
;CHECK: ret
define i32 @foo(i32 %t, i32 %l) nounwind readnone ssp uwtable {
%1 = icmp eq i32 %t, 0
br i1 %1, label %4, label %2
; <label>:2 ; preds = %0
%3 = add nsw i32 %t, 2
ret i32 %3
; <label>:4 ; preds = %0
%5 = icmp eq i32 %l, 0
%. = select i1 %5, i32 0, i32 5
ret i32 %.
}