From: Owen Anderson Date: Tue, 31 Aug 2010 07:41:39 +0000 (+0000) Subject: Rename file to something more descriptive. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=7aff1cd0389d922d752b57b9ccf942b457977955;p=oota-llvm.git Rename file to something more descriptive. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@112590 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/CMakeLists.txt b/lib/Transforms/Scalar/CMakeLists.txt index 69b4c341c5b..b7598eace53 100644 --- a/lib/Transforms/Scalar/CMakeLists.txt +++ b/lib/Transforms/Scalar/CMakeLists.txt @@ -3,6 +3,7 @@ add_llvm_library(LLVMScalarOpts BasicBlockPlacement.cpp CodeGenPrepare.cpp ConstantProp.cpp + CorrelatedValuePropagation.cpp DCE.cpp DeadStoreElimination.cpp GEPSplitter.cpp @@ -29,7 +30,6 @@ add_llvm_library(LLVMScalarOpts Sink.cpp TailDuplication.cpp TailRecursionElimination.cpp - ValuePropagation.cpp ) target_link_libraries (LLVMScalarOpts LLVMTransformUtils) diff --git a/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp b/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp new file mode 100644 index 00000000000..8f398883a2c --- /dev/null +++ b/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp @@ -0,0 +1,119 @@ +//===- ValuePropagation.cpp - Propagate information derived control flow --===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements the Value Propagation pass. +// +//===----------------------------------------------------------------------===// + +#define DEBUG_TYPE "value-propagation" +#include "llvm/Transforms/Scalar.h" +#include "llvm/Function.h" +#include "llvm/Instructions.h" +#include "llvm/Pass.h" +#include "llvm/Analysis/LazyValueInfo.h" +#include "llvm/Transforms/Utils/Local.h" +#include "llvm/ADT/Statistic.h" +using namespace llvm; + +STATISTIC(NumPhis, "Number of phis propagated"); +STATISTIC(NumSelects, "Number of selects propagated"); + +namespace { + class ValuePropagation : public FunctionPass { + LazyValueInfo *LVI; + + bool processSelect(SelectInst *SI); + bool processPHI(PHINode *P); + + public: + static char ID; + ValuePropagation(): FunctionPass(ID) { } + + bool runOnFunction(Function &F); + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequired(); + } + }; +} + +char ValuePropagation::ID = 0; +INITIALIZE_PASS(ValuePropagation, "value-propagation", + "Value Propagation", false, false); + +// Public interface to the Value Propagation pass +Pass *llvm::createValuePropagationPass() { + return new ValuePropagation(); +} + +bool ValuePropagation::processSelect(SelectInst *S) { + if (S->getType()->isVectorTy()) return false; + + Constant *C = LVI->getConstant(S->getOperand(0), S->getParent()); + if (!C) return false; + + ConstantInt *CI = dyn_cast(C); + if (!CI) return false; + + S->replaceAllUsesWith(S->getOperand(CI->isOne() ? 1 : 2)); + S->eraseFromParent(); + + ++NumSelects; + + return true; +} + +bool ValuePropagation::processPHI(PHINode *P) { + bool Changed = false; + + BasicBlock *BB = P->getParent(); + for (unsigned i = 0, e = P->getNumIncomingValues(); i < e; ++i) { + Value *Incoming = P->getIncomingValue(i); + if (isa(Incoming)) continue; + + Constant *C = LVI->getConstantOnEdge(P->getIncomingValue(i), + P->getIncomingBlock(i), + BB); + if (!C) continue; + + P->setIncomingValue(i, C); + Changed = true; + } + + if (Value *ConstVal = P->hasConstantValue()) { + P->replaceAllUsesWith(ConstVal); + P->eraseFromParent(); + Changed = true; + } + + ++NumPhis; + + return Changed; +} + +bool ValuePropagation::runOnFunction(Function &F) { + LVI = &getAnalysis(); + + bool Changed = false; + + for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI) + for (BasicBlock::iterator BI = FI->begin(), BE = FI->end(); BI != BE; ) { + Instruction *II = BI++; + if (SelectInst *SI = dyn_cast(II)) + Changed |= processSelect(SI); + else if (PHINode *P = dyn_cast(II)) + Changed |= processPHI(P); + } + + if (Changed) + for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI) + SimplifyInstructionsInBlock(FI); + + return Changed; +} diff --git a/lib/Transforms/Scalar/ValuePropagation.cpp b/lib/Transforms/Scalar/ValuePropagation.cpp deleted file mode 100644 index 8f398883a2c..00000000000 --- a/lib/Transforms/Scalar/ValuePropagation.cpp +++ /dev/null @@ -1,119 +0,0 @@ -//===- ValuePropagation.cpp - Propagate information derived control flow --===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the Value Propagation pass. -// -//===----------------------------------------------------------------------===// - -#define DEBUG_TYPE "value-propagation" -#include "llvm/Transforms/Scalar.h" -#include "llvm/Function.h" -#include "llvm/Instructions.h" -#include "llvm/Pass.h" -#include "llvm/Analysis/LazyValueInfo.h" -#include "llvm/Transforms/Utils/Local.h" -#include "llvm/ADT/Statistic.h" -using namespace llvm; - -STATISTIC(NumPhis, "Number of phis propagated"); -STATISTIC(NumSelects, "Number of selects propagated"); - -namespace { - class ValuePropagation : public FunctionPass { - LazyValueInfo *LVI; - - bool processSelect(SelectInst *SI); - bool processPHI(PHINode *P); - - public: - static char ID; - ValuePropagation(): FunctionPass(ID) { } - - bool runOnFunction(Function &F); - - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.addRequired(); - } - }; -} - -char ValuePropagation::ID = 0; -INITIALIZE_PASS(ValuePropagation, "value-propagation", - "Value Propagation", false, false); - -// Public interface to the Value Propagation pass -Pass *llvm::createValuePropagationPass() { - return new ValuePropagation(); -} - -bool ValuePropagation::processSelect(SelectInst *S) { - if (S->getType()->isVectorTy()) return false; - - Constant *C = LVI->getConstant(S->getOperand(0), S->getParent()); - if (!C) return false; - - ConstantInt *CI = dyn_cast(C); - if (!CI) return false; - - S->replaceAllUsesWith(S->getOperand(CI->isOne() ? 1 : 2)); - S->eraseFromParent(); - - ++NumSelects; - - return true; -} - -bool ValuePropagation::processPHI(PHINode *P) { - bool Changed = false; - - BasicBlock *BB = P->getParent(); - for (unsigned i = 0, e = P->getNumIncomingValues(); i < e; ++i) { - Value *Incoming = P->getIncomingValue(i); - if (isa(Incoming)) continue; - - Constant *C = LVI->getConstantOnEdge(P->getIncomingValue(i), - P->getIncomingBlock(i), - BB); - if (!C) continue; - - P->setIncomingValue(i, C); - Changed = true; - } - - if (Value *ConstVal = P->hasConstantValue()) { - P->replaceAllUsesWith(ConstVal); - P->eraseFromParent(); - Changed = true; - } - - ++NumPhis; - - return Changed; -} - -bool ValuePropagation::runOnFunction(Function &F) { - LVI = &getAnalysis(); - - bool Changed = false; - - for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI) - for (BasicBlock::iterator BI = FI->begin(), BE = FI->end(); BI != BE; ) { - Instruction *II = BI++; - if (SelectInst *SI = dyn_cast(II)) - Changed |= processSelect(SI); - else if (PHINode *P = dyn_cast(II)) - Changed |= processPHI(P); - } - - if (Changed) - for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI) - SimplifyInstructionsInBlock(FI); - - return Changed; -}