From 0a53cb2ac00d4b47fead0854a53815ecb77b2198 Mon Sep 17 00:00:00 2001 From: kai Date: Sat, 8 Sep 2012 13:36:31 +0200 Subject: [PATCH] Add -vectorize to the optimizer. This is available starting with LLVM 3.1. --- gen/optimizer.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/gen/optimizer.cpp b/gen/optimizer.cpp index 59dd4e9f..c916fd15 100644 --- a/gen/optimizer.cpp +++ b/gen/optimizer.cpp @@ -71,6 +71,16 @@ enableInlining("inlining", cl::desc("(*) Enable function inlining in -O"), cl::ZeroOrMore); +#if LDC_LLVM_VER >= 301 +static cl::opt +runVectorization("vectorize", cl::desc("Run vectorization passes")); + +static cl::opt +useGVNAfterVectorization("use-gvn-after-vectorization", + cl::init(false), cl::Hidden, + cl::desc("Run GVN instead of Early CSE after vectorization passes")); +#endif + // Determine whether or not to run the inliner as part of the default list of // optimization passes. // If not explicitly specified, treat as false for -O0-2, and true for -O3. @@ -230,6 +240,19 @@ static void addPassesForOptLevel(PassManager& pm) { addPass(pm, createConstantMergePass()); } +#if LDC_LLVM_VER >= 301 + // -vectorize + if (runVectorization) + { + addPass(pm, createBBVectorizePass()); + addPass(pm, createInstructionCombiningPass()); + if (optimizeLevel > 1 && useGVNAfterVectorization) + addPass(pm, createGVNPass()); // Remove redundancies + else + addPass(pm, createEarlyCSEPass()); // Catch trivial redundancies + } +#endif + if (optimizeLevel >= 1) { addPass(pm, createStripExternalsPass()); addPass(pm, createGlobalDCEPass());