diff options
Diffstat (limited to 'lib/Transforms/Scalar/Scalarizer.cpp')
-rw-r--r-- | lib/Transforms/Scalar/Scalarizer.cpp | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/lib/Transforms/Scalar/Scalarizer.cpp b/lib/Transforms/Scalar/Scalarizer.cpp index 7a73f11..6036c09 100644 --- a/lib/Transforms/Scalar/Scalarizer.cpp +++ b/lib/Transforms/Scalar/Scalarizer.cpp @@ -150,6 +150,16 @@ public: bool visitLoadInst(LoadInst &); bool visitStoreInst(StoreInst &); + static void registerOptions() { + // This is disabled by default because having separate loads and stores + // makes it more likely that the -combiner-alias-analysis limits will be + // reached. + OptionRegistry::registerOption<bool, Scalarizer, + &Scalarizer::ScalarizeLoadStore>( + "scalarize-load-store", + "Allow the scalarizer pass to scalarize loads and store", false); + } + private: Scatterer scatter(Instruction *, Value *); void gather(Instruction *, const ValueVector &); @@ -164,19 +174,14 @@ private: GatherList Gathered; unsigned ParallelLoopAccessMDKind; const DataLayout *DL; + bool ScalarizeLoadStore; }; char Scalarizer::ID = 0; } // end anonymous namespace -// This is disabled by default because having separate loads and stores makes -// it more likely that the -combiner-alias-analysis limits will be reached. -static cl::opt<bool> ScalarizeLoadStore - ("scalarize-load-store", cl::Hidden, cl::init(false), - cl::desc("Allow the scalarizer pass to scalarize loads and store")); - -INITIALIZE_PASS(Scalarizer, "scalarizer", "Scalarize vector operations", - false, false) +INITIALIZE_PASS_WITH_OPTIONS(Scalarizer, "scalarizer", + "Scalarize vector operations", false, false) Scatterer::Scatterer(BasicBlock *bb, BasicBlock::iterator bbi, Value *v, ValueVector *cachePtr) @@ -236,7 +241,9 @@ Value *Scatterer::operator[](unsigned I) { bool Scalarizer::doInitialization(Module &M) { ParallelLoopAccessMDKind = - M.getContext().getMDKindID("llvm.mem.parallel_loop_access"); + M.getContext().getMDKindID("llvm.mem.parallel_loop_access"); + ScalarizeLoadStore = + M.getContext().getOption<bool, Scalarizer, &Scalarizer::ScalarizeLoadStore>(); return false; } @@ -312,6 +319,8 @@ bool Scalarizer::canTransferMetadata(unsigned Tag) { || Tag == LLVMContext::MD_fpmath || Tag == LLVMContext::MD_tbaa_struct || Tag == LLVMContext::MD_invariant_load + || Tag == LLVMContext::MD_alias_scope + || Tag == LLVMContext::MD_noalias || Tag == ParallelLoopAccessMDKind); } @@ -322,8 +331,10 @@ void Scalarizer::transferMetadata(Instruction *Op, const ValueVector &CV) { Op->getAllMetadataOtherThanDebugLoc(MDs); for (unsigned I = 0, E = CV.size(); I != E; ++I) { if (Instruction *New = dyn_cast<Instruction>(CV[I])) { - for (SmallVectorImpl<std::pair<unsigned, MDNode *> >::iterator - MI = MDs.begin(), ME = MDs.end(); MI != ME; ++MI) + for (SmallVectorImpl<std::pair<unsigned, MDNode *>>::iterator + MI = MDs.begin(), + ME = MDs.end(); + MI != ME; ++MI) if (canTransferMetadata(MI->first)) New->setMetadata(MI->first, MI->second); New->setDebugLoc(Op->getDebugLoc()); |