[llvm] r179353 - Add a flag to align all basic blocks in the function.
Nadav Rotem
nrotem at apple.com
Thu Apr 11 17:48:32 PDT 2013
Author: nadav
Date: Thu Apr 11 19:48:32 2013
New Revision: 179353
URL: http://llvm.org/viewvc/llvm-project?rev=179353&view=rev
Log:
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.
Added:
llvm/trunk/test/CodeGen/X86/code_placement_align_all.ll
Modified:
llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp
Modified: llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp?rev=179353&r1=179352&r2=179353&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp (original)
+++ llvm/trunk/lib/CodeGen/MachineBlockPlacement.cpp Thu Apr 11 19:48:32 2013
@@ -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::runOnMachine
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();
Added: llvm/trunk/test/CodeGen/X86/code_placement_align_all.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/code_placement_align_all.ll?rev=179353&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/code_placement_align_all.ll (added)
+++ llvm/trunk/test/CodeGen/X86/code_placement_align_all.ll Thu Apr 11 19:48:32 2013
@@ -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 %.
+}
+
+
More information about the llvm-commits
mailing list