From: John Criswell Date: Thu, 27 Oct 2005 15:54:34 +0000 (+0000) Subject: Move some constant folding code shared by Analysis and Transform passes X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=a11564335749cd259d8a1391be34c1abbe302c42;p=oota-llvm.git Move some constant folding code shared by Analysis and Transform passes into the LLVMAnalysis library. This allows LLVMTranform and LLVMTransformUtils to be archives and linked with LLVMAnalysis.a, which provides any missing definitions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24036 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Makefile.rules b/Makefile.rules index 04f3660a1ab..9f07c1ad683 100644 --- a/Makefile.rules +++ b/Makefile.rules @@ -617,7 +617,7 @@ ifdef ENABLE_ALPHA_JIT JIT_LIBS += LLVMAlpha LLVMSelectionDAG endif -LLVMLIBS := $(JIT_LIBS) LLVMScalarOpts.a LLVMTransformUtils LLVMAnalysis.a \ +LLVMLIBS := $(JIT_LIBS) LLVMScalarOpts.a LLVMTransformUtils.a LLVMAnalysis.a \ LLVMBCReader LLVMCore LLVMSupport.a LLVMTarget.a LLVMbzip2 \ LLVMSystem.a $(PLATFORMLIBDL) endif diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index 77f5e3872fc..120b9f5e488 100644 --- a/lib/Analysis/ScalarEvolution.cpp +++ b/lib/Analysis/ScalarEvolution.cpp @@ -64,10 +64,10 @@ #include "llvm/DerivedTypes.h" #include "llvm/GlobalVariable.h" #include "llvm/Instructions.h" +#include "llvm/Analysis/ConstantFolding.h" #include "llvm/Analysis/LoopInfo.h" #include "llvm/Assembly/Writer.h" #include "llvm/Transforms/Scalar.h" -#include "llvm/Transforms/Utils/Local.h" #include "llvm/Support/CFG.h" #include "llvm/Support/ConstantRange.h" #include "llvm/Support/InstIterator.h" diff --git a/lib/Transforms/Utils/Local.cpp b/lib/Transforms/Utils/Local.cpp index a9cfcc0a920..d82b278f402 100644 --- a/lib/Transforms/Utils/Local.cpp +++ b/lib/Transforms/Utils/Local.cpp @@ -12,6 +12,7 @@ // //===----------------------------------------------------------------------===// +#include "llvm/Analysis/ConstantFolding.h" #include "llvm/Transforms/Utils/Local.h" #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" @@ -234,148 +235,6 @@ bool llvm::ConstantFoldTerminator(BasicBlock *BB) { return false; } -/// canConstantFoldCallTo - Return true if its even possible to fold a call to -/// the specified function. -bool llvm::canConstantFoldCallTo(Function *F) { - const std::string &Name = F->getName(); - - switch (F->getIntrinsicID()) { - case Intrinsic::isunordered: - case Intrinsic::sqrt: - return true; - default: break; - } - - switch (Name[0]) - { - case 'a': - return Name == "acos" || Name == "asin" || Name == "atan" || - Name == "atan2"; - case 'c': - return Name == "ceil" || Name == "cos" || Name == "cosf" || - Name == "cosh"; - case 'e': - return Name == "exp"; - case 'f': - return Name == "fabs" || Name == "fmod" || Name == "floor"; - case 'l': - return Name == "log" || Name == "log10"; - case 'p': - return Name == "pow"; - case 's': - return Name == "sin" || Name == "sinh" || Name == "sqrt"; - case 't': - return Name == "tan" || Name == "tanh"; - default: - return false; - } -} - -static Constant *ConstantFoldFP(double (*NativeFP)(double), double V, - const Type *Ty) { - errno = 0; - V = NativeFP(V); - if (errno == 0) - return ConstantFP::get(Ty, V); - return 0; -} - -/// ConstantFoldCall - Attempt to constant fold a call to the specified function -/// with the specified arguments, returning null if unsuccessful. -Constant *llvm::ConstantFoldCall(Function *F, - const std::vector &Operands) { - const std::string &Name = F->getName(); - const Type *Ty = F->getReturnType(); - - if (Operands.size() == 1) { - if (ConstantFP *Op = dyn_cast(Operands[0])) { - double V = Op->getValue(); - switch (Name[0]) - { - case 'a': - if (Name == "acos") - return ConstantFoldFP(acos, V, Ty); - else if (Name == "asin") - return ConstantFoldFP(asin, V, Ty); - else if (Name == "atan") - return ConstantFP::get(Ty, atan(V)); - break; - case 'c': - if (Name == "ceil") - return ConstantFoldFP(ceil, V, Ty); - else if (Name == "cos") - return ConstantFP::get(Ty, cos(V)); - else if (Name == "cosh") - return ConstantFP::get(Ty, cosh(V)); - break; - case 'e': - if (Name == "exp") - return ConstantFP::get(Ty, exp(V)); - break; - case 'f': - if (Name == "fabs") - return ConstantFP::get(Ty, fabs(V)); - else if (Name == "floor") - return ConstantFoldFP(floor, V, Ty); - break; - case 'l': - if (Name == "log" && V > 0) - return ConstantFP::get(Ty, log(V)); - else if (Name == "log10" && V > 0) - return ConstantFoldFP(log10, V, Ty); - else if (Name == "llvm.sqrt") { - if (V >= -0.0) - return ConstantFP::get(Ty, sqrt(V)); - else // Undefined - return ConstantFP::get(Ty, 0.0); - } - break; - case 's': - if (Name == "sin") - return ConstantFP::get(Ty, sin(V)); - else if (Name == "sinh") - return ConstantFP::get(Ty, sinh(V)); - else if (Name == "sqrt" && V >= 0) - return ConstantFP::get(Ty, sqrt(V)); - break; - case 't': - if (Name == "tan") - return ConstantFP::get(Ty, tan(V)); - else if (Name == "tanh") - return ConstantFP::get(Ty, tanh(V)); - break; - default: - break; - } - } - } else if (Operands.size() == 2) { - if (ConstantFP *Op1 = dyn_cast(Operands[0])) { - double Op1V = Op1->getValue(); - if (ConstantFP *Op2 = dyn_cast(Operands[1])) { - double Op2V = Op2->getValue(); - - if (Name == "llvm.isunordered") - return ConstantBool::get(IsNAN(Op1V) || IsNAN(Op2V)); - else - if (Name == "pow") { - errno = 0; - double V = pow(Op1V, Op2V); - if (errno == 0) - return ConstantFP::get(Ty, V); - } else if (Name == "fmod") { - errno = 0; - double V = fmod(Op1V, Op2V); - if (errno == 0) - return ConstantFP::get(Ty, V); - } else if (Name == "atan2") - return ConstantFP::get(Ty, atan2(Op1V,Op2V)); - } - } - } - return 0; -} - - /// ConstantFoldLoadThroughGEPConstantExpr - Given a constant and a /// getelementptr constantexpr, return the constant value being addressed by the /// constant expression, or null if something is funny and we can't decide. diff --git a/lib/Transforms/Utils/Makefile b/lib/Transforms/Utils/Makefile index a0c49bd9dfe..26fc4261f16 100644 --- a/lib/Transforms/Utils/Makefile +++ b/lib/Transforms/Utils/Makefile @@ -9,6 +9,7 @@ LEVEL = ../../.. LIBRARYNAME = LLVMTransformUtils +BUILD_ARCHIVE = 1 include $(LEVEL)/Makefile.common diff --git a/tools/analyze/Makefile b/tools/analyze/Makefile index 0d1c2485eba..06def88d01a 100644 --- a/tools/analyze/Makefile +++ b/tools/analyze/Makefile @@ -11,6 +11,6 @@ TOOLNAME = analyze USEDLIBS = LLVMAsmParser LLVMBCReader LLVMAnalysis.a LLVMipa.a \ LLVMDataStructure \ LLVMScalarOpts.a LLVMTransforms.a LLVMTarget.a LLVMScalarOpts.a \ - LLVMTransformUtils LLVMCore LLVMSupport.a LLVMbzip2 LLVMSystem.a + LLVMTransformUtils.a LLVMCore LLVMSupport.a LLVMbzip2 LLVMSystem.a include $(LEVEL)/Makefile.common diff --git a/tools/bugpoint/Makefile b/tools/bugpoint/Makefile index 0b198323afe..6460aa82aa2 100644 --- a/tools/bugpoint/Makefile +++ b/tools/bugpoint/Makefile @@ -14,7 +14,7 @@ OPTLIBS = LLVMTransforms.a LLVMInstrumentation.a ANALIBS = LLVMDataStructure LLVMipa.a LLVMTarget.a USEDLIBS = LLVMipo.a LLVMScalarOpts.a $(OPTLIBS) $(ANALIBS) LLVMAnalysis.a \ - LLVMTransformUtils \ + LLVMTransformUtils.a \ LLVMAsmParser LLVMLinker.a LLVMBCReader LLVMBCWriter \ LLVMCore LLVMSupport.a LLVMbzip2 LLVMSystem.a diff --git a/tools/gccas/Makefile b/tools/gccas/Makefile index 8359a760810..32c10c88658 100644 --- a/tools/gccas/Makefile +++ b/tools/gccas/Makefile @@ -10,7 +10,7 @@ LEVEL = ../.. TOOLNAME = gccas USEDLIBS = LLVMAsmParser LLVMBCWriter LLVMTransforms.a LLVMipo.a LLVMipa.a \ - LLVMScalarOpts.a LLVMAnalysis.a LLVMTarget.a LLVMTransformUtils \ + LLVMScalarOpts.a LLVMAnalysis.a LLVMTarget.a LLVMTransformUtils.a \ LLVMCore LLVMSupport.a LLVMbzip2 LLVMSystem.a include $(LEVEL)/Makefile.common diff --git a/tools/gccld/Makefile b/tools/gccld/Makefile index e55a85e8f67..96e73d68713 100644 --- a/tools/gccld/Makefile +++ b/tools/gccld/Makefile @@ -11,7 +11,7 @@ LEVEL = ../.. TOOLNAME = gccld USEDLIBS = LLVMipo.a LLVMTransforms.a LLVMScalarOpts.a LLVMAnalysis.a \ - LLVMipa.a LLVMTransformUtils LLVMTarget.a LLVMLinker.a \ + LLVMipa.a LLVMTransformUtils.a LLVMTarget.a LLVMLinker.a \ LLVMArchive.a LLVMBCReader LLVMBCWriter \ LLVMCore LLVMSupport.a LLVMbzip2 LLVMSystem.a diff --git a/tools/llc/Makefile b/tools/llc/Makefile index ef21140a137..031012a8e58 100644 --- a/tools/llc/Makefile +++ b/tools/llc/Makefile @@ -70,7 +70,7 @@ USEDLIBS += \ LLVMipa.a \ LLVMTransforms.a \ LLVMScalarOpts.a \ - LLVMTransformUtils \ + LLVMTransformUtils.a \ LLVMAnalysis.a \ LLVMBCReader \ LLVMBCWriter \ diff --git a/tools/llvm-extract/Makefile b/tools/llvm-extract/Makefile index 69e7e7f9279..80a90fa41a8 100644 --- a/tools/llvm-extract/Makefile +++ b/tools/llvm-extract/Makefile @@ -10,7 +10,7 @@ LEVEL = ../.. TOOLNAME = llvm-extract USEDLIBS = LLVMBCReader LLVMBCWriter LLVMTransforms.a LLVMipo.a LLVMTarget.a \ - LLVMAnalysis.a LLVMTransformUtils LLVMipa.a \ + LLVMAnalysis.a LLVMTransformUtils.a LLVMipa.a \ LLVMCore LLVMSupport.a LLVMbzip2 LLVMSystem.a include $(LEVEL)/Makefile.common diff --git a/tools/llvm-ld/Makefile b/tools/llvm-ld/Makefile index 880df9f4fc6..34d6dc69ca4 100644 --- a/tools/llvm-ld/Makefile +++ b/tools/llvm-ld/Makefile @@ -11,7 +11,7 @@ LEVEL = ../.. TOOLNAME = llvm-ld USEDLIBS = LLVMipo.a LLVMTransforms.a LLVMScalarOpts.a LLVMAnalysis.a \ - LLVMipa.a LLVMTransformUtils LLVMTarget.a LLVMLinker.a \ + LLVMipa.a LLVMTransformUtils.a LLVMTarget.a LLVMLinker.a \ LLVMArchive.a LLVMBCReader LLVMBCWriter \ LLVMCore LLVMSupport.a LLVMbzip2 LLVMSystem.a diff --git a/tools/opt/Makefile b/tools/opt/Makefile index fcc6c5fc5df..4fd8293eb03 100644 --- a/tools/opt/Makefile +++ b/tools/opt/Makefile @@ -11,7 +11,7 @@ TOOLNAME = opt USEDLIBS = LLVMBCReader LLVMBCWriter LLVMInstrumentation.a \ LLVMScalarOpts.a LLVMipo.a LLVMipa.a LLVMDataStructure LLVMTransforms.a \ - LLVMTarget.a LLVMAnalysis.a LLVMTransformUtils LLVMCore LLVMSupport.a \ + LLVMTarget.a LLVMAnalysis.a LLVMTransformUtils.a LLVMCore LLVMSupport.a \ LLVMbzip2 LLVMSystem.a include $(LEVEL)/Makefile.common