[llvm-commits] [llvm] r85346 - in /llvm/trunk: include/llvm/CodeGen/Passes.h lib/CodeGen/BranchFolding.cpp lib/CodeGen/BranchFolding.h lib/CodeGen/IfConversion.cpp lib/CodeGen/LLVMTargetMachine.cpp lib/Target/ARM/ARMTargetMachine.cpp
Evan Cheng
evan.cheng at apple.com
Tue Oct 27 18:15:09 PDT 2009
On Oct 27, 2009, at 4:49 PM, Bob Wilson wrote:
> Author: bwilson
> Date: Tue Oct 27 18:49:38 2009
> New Revision: 85346
>
> URL: http://llvm.org/viewvc/llvm-project?rev=85346&view=rev
> Log:
> Record CodeGen optimization level in the BranchFolding pass so that
> we can
> use it to control tail merging when there is a tradeoff between
> performance
> and code size. When there is only 1 instruction in the common tail,
> we have
> been merging. That can be good for code size but is a definite loss
> for
> performance. Now we will avoid tail merging in that case when the
> optimization level is "Aggressive", i.e., "-O3". Radar 7338114.
Just then controlling this with optimization level, we should only do
it when the function is marked OptSize. Would that work?
Evan
>
> Since the IfConversion pass invokes BranchFolding, it too needs to
> know
> the optimization level. Note that I removed the RegisterPass
> instantiation
> for IfConversion because it required a default constructor. If
> someone
> wants to keep that for some reason, we can add a default constructor
> with
> a hard-wired optimization level.
>
> Modified:
> llvm/trunk/include/llvm/CodeGen/Passes.h
> llvm/trunk/lib/CodeGen/BranchFolding.cpp
> llvm/trunk/lib/CodeGen/BranchFolding.h
> llvm/trunk/lib/CodeGen/IfConversion.cpp
> llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp
> llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp
>
> Modified: llvm/trunk/include/llvm/CodeGen/Passes.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/Passes.h?rev=85346&r1=85345&r2=85346&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/include/llvm/CodeGen/Passes.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/Passes.h Tue Oct 27 18:49:38 2009
> @@ -127,10 +127,11 @@
> /// optimizations to delete branches to branches, eliminate
> branches to
> /// successor blocks (creating fall throughs), and eliminating
> branches over
> /// branches.
> - FunctionPass *createBranchFoldingPass(bool DefaultEnableTailMerge);
> + FunctionPass *createBranchFoldingPass(bool DefaultEnableTailMerge,
> + CodeGenOpt::Level OptLevel);
>
> - /// IfConverter Pass - This pass performs machine code if
> conversion.
> - FunctionPass *createIfConverterPass();
> + /// IfConverter Pass - This pass performs machine code if-
> conversion.
> + FunctionPass *createIfConverterPass(CodeGenOpt::Level OptLevel);
>
> /// Code Placement Pass - This pass optimize code placement and
> aligns loop
> /// headers to target specific alignment boundary.
>
> Modified: llvm/trunk/lib/CodeGen/BranchFolding.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/BranchFolding.cpp?rev=85346&r1=85345&r2=85346&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/CodeGen/BranchFolding.cpp (original)
> +++ llvm/trunk/lib/CodeGen/BranchFolding.cpp Tue Oct 27 18:49:38 2009
> @@ -50,8 +50,9 @@
>
> char BranchFolderPass::ID = 0;
>
> -FunctionPass *llvm::createBranchFoldingPass(bool
> DefaultEnableTailMerge) {
> - return new BranchFolderPass(DefaultEnableTailMerge);
> +FunctionPass *llvm::createBranchFoldingPass(bool
> DefaultEnableTailMerge,
> + CodeGenOpt::Level
> OptLevel) {
> + return new BranchFolderPass(DefaultEnableTailMerge, OptLevel);
> }
>
> bool BranchFolderPass::runOnMachineFunction(MachineFunction &MF) {
> @@ -63,7 +64,8 @@
>
>
>
> -BranchFolder::BranchFolder(bool defaultEnableTailMerge) {
> +BranchFolder::BranchFolder(bool defaultEnableTailMerge,
> CodeGenOpt::Level OL) {
> + OptLevel = OL;
> switch (FlagEnableTailMerge) {
> case cl::BOU_UNSET: EnableTailMerge = defaultEnableTailMerge; break;
> case cl::BOU_TRUE: EnableTailMerge = true; break;
> @@ -470,7 +472,8 @@
> I->second,
> TrialBBI1, TrialBBI2);
> // If we will have to split a block, there should be at least
> - // minCommonTailLength instructions in common; if not, at worst
> + // minCommonTailLength instructions in common; if not, and if
> we are not
> + // optimizing for performance at the expense of code size, at
> worst
> // we will be replacing a fallthrough into the common tail
> with a
> // branch, which at worst breaks even with falling through into
> // the duplicated common tail, so 1 instruction in common is
> enough.
> @@ -478,7 +481,8 @@
> // tail if there is one.
> // (Empty blocks will get forwarded and need not be considered.)
> if (CommonTailLen >= minCommonTailLength ||
> - (CommonTailLen > 0 &&
> + (OptLevel != CodeGenOpt::Aggressive &&
> + CommonTailLen > 0 &&
> (TrialBBI1==CurMPIter->second->begin() ||
> TrialBBI2==I->second->begin()))) {
> if (CommonTailLen > maxCommonTailLength) {
>
> Modified: llvm/trunk/lib/CodeGen/BranchFolding.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/BranchFolding.h?rev=85346&r1=85345&r2=85346&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/CodeGen/BranchFolding.h (original)
> +++ llvm/trunk/lib/CodeGen/BranchFolding.h Tue Oct 27 18:49:38 2009
> @@ -12,6 +12,7 @@
>
> #include "llvm/CodeGen/MachineBasicBlock.h"
> #include "llvm/CodeGen/MachineFunctionPass.h"
> +#include "llvm/Target/TargetMachine.h"
> #include <vector>
>
> namespace llvm {
> @@ -23,7 +24,7 @@
>
> class BranchFolder {
> public:
> - explicit BranchFolder(bool defaultEnableTailMerge);
> + explicit BranchFolder(bool defaultEnableTailMerge,
> CodeGenOpt::Level OL);
>
> bool OptimizeFunction(MachineFunction &MF,
> const TargetInstrInfo *tii,
> @@ -37,6 +38,7 @@
> typedef std::pair<MPIterator, MachineBasicBlock::iterator>
> SameTailElt;
> std::vector<SameTailElt> SameTails;
>
> + CodeGenOpt::Level OptLevel;
> bool EnableTailMerge;
> const TargetInstrInfo *TII;
> const TargetRegisterInfo *TRI;
> @@ -73,8 +75,10 @@
> public BranchFolder {
> public:
> static char ID;
> - explicit BranchFolderPass(bool defaultEnableTailMerge)
> - : MachineFunctionPass(&ID), BranchFolder
> (defaultEnableTailMerge) {}
> + explicit BranchFolderPass(bool defaultEnableTailMerge,
> + CodeGenOpt::Level OptLevel)
> + : MachineFunctionPass(&ID),
> + BranchFolder(defaultEnableTailMerge, OptLevel) {}
>
> virtual bool runOnMachineFunction(MachineFunction &MF);
> virtual const char *getPassName() const { return "Control Flow
> Optimizer"; }
>
> Modified: llvm/trunk/lib/CodeGen/IfConversion.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/IfConversion.cpp?rev=85346&r1=85345&r2=85346&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/CodeGen/IfConversion.cpp (original)
> +++ llvm/trunk/lib/CodeGen/IfConversion.cpp Tue Oct 27 18:49:38 2009
> @@ -148,9 +148,11 @@
> const TargetInstrInfo *TII;
> bool MadeChange;
> int FnNum;
> + CodeGenOpt::Level OptLevel;
> public:
> static char ID;
> - IfConverter() : MachineFunctionPass(&ID), FnNum(-1) {}
> + IfConverter(CodeGenOpt::Level OL) :
> + MachineFunctionPass(&ID), FnNum(-1), OptLevel(OL) {}
>
> virtual bool runOnMachineFunction(MachineFunction &MF);
> virtual const char *getPassName() const { return "If Converter"; }
> @@ -219,10 +221,9 @@
> char IfConverter::ID = 0;
> }
>
> -static RegisterPass<IfConverter>
> -X("if-converter", "If Converter");
> -
> -FunctionPass *llvm::createIfConverterPass() { return new IfConverter
> (); }
> +FunctionPass *llvm::createIfConverterPass(CodeGenOpt::Level
> OptLevel) {
> + return new IfConverter(OptLevel);
> +}
>
> bool IfConverter::runOnMachineFunction(MachineFunction &MF) {
> TLI = MF.getTarget().getTargetLowering();
> @@ -362,7 +363,7 @@
> BBAnalysis.clear();
>
> if (MadeChange) {
> - BranchFolder BF(false);
> + BranchFolder BF(false, OptLevel);
> BF.OptimizeFunction(MF, TII,
> MF.getTarget().getRegisterInfo(),
> getAnalysisIfAvailable<MachineModuleInfo>());
>
> Modified: llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp?rev=85346&r1=85345&r2=85346&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp (original)
> +++ llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp Tue Oct 27 18:49:38
> 2009
> @@ -329,7 +329,7 @@
>
> // Branch folding must be run after regalloc and prolog/epilog
> insertion.
> if (OptLevel != CodeGenOpt::None) {
> - PM.add(createBranchFoldingPass(getEnableTailMergeDefault()));
> + PM.add(createBranchFoldingPass(getEnableTailMergeDefault(),
> OptLevel));
> printAndVerify(PM);
> }
>
>
> Modified: llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp?rev=85346&r1=85345&r2=85346&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp Tue Oct 27
> 18:49:38 2009
> @@ -113,7 +113,7 @@
> CodeGenOpt::Level
> OptLevel) {
> // FIXME: temporarily disabling load / store optimization pass for
> Thumb1.
> if (OptLevel != CodeGenOpt::None && !Subtarget.isThumb1Only())
> - PM.add(createIfConverterPass());
> + PM.add(createIfConverterPass(OptLevel));
>
> if (Subtarget.isThumb2()) {
> PM.add(createThumb2ITBlockPass());
>
>
> _______________________________________________
> 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