summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Criswell <criswell@uiuc.edu>2005-10-27 15:54:34 +0000
committerJohn Criswell <criswell@uiuc.edu>2005-10-27 15:54:34 +0000
commita11564335749cd259d8a1391be34c1abbe302c42 (patch)
treea1f3f003c0d7a5dfc6a47944901c44182eed5d84
parentfe7f046de875e41dd338163a719a32571da7ec06 (diff)
downloadllvm-a11564335749cd259d8a1391be34c1abbe302c42.tar.gz
llvm-a11564335749cd259d8a1391be34c1abbe302c42.tar.bz2
llvm-a11564335749cd259d8a1391be34c1abbe302c42.tar.xz
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
-rw-r--r--Makefile.rules2
-rw-r--r--lib/Analysis/ScalarEvolution.cpp2
-rw-r--r--lib/Transforms/Utils/Local.cpp143
-rw-r--r--lib/Transforms/Utils/Makefile1
-rw-r--r--tools/analyze/Makefile2
-rw-r--r--tools/bugpoint/Makefile2
-rw-r--r--tools/gccas/Makefile2
-rw-r--r--tools/gccld/Makefile2
-rw-r--r--tools/llc/Makefile2
-rw-r--r--tools/llvm-extract/Makefile2
-rw-r--r--tools/llvm-ld/Makefile2
-rw-r--r--tools/opt/Makefile2
12 files changed, 12 insertions, 152 deletions
diff --git a/Makefile.rules b/Makefile.rules
index 04f3660a1a..9f07c1ad68 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 77f5e3872f..120b9f5e48 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 a9cfcc0a92..d82b278f40 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<Constant*> &Operands) {
- const std::string &Name = F->getName();
- const Type *Ty = F->getReturnType();
-
- if (Operands.size() == 1) {
- if (ConstantFP *Op = dyn_cast<ConstantFP>(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<ConstantFP>(Operands[0])) {
- double Op1V = Op1->getValue();
- if (ConstantFP *Op2 = dyn_cast<ConstantFP>(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 a0c49bd9df..26fc4261f1 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 0d1c2485eb..06def88d01 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 0b198323af..6460aa82aa 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 8359a76081..32c10c8865 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 e55a85e8f6..96e73d6871 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 ef21140a13..031012a8e5 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 69e7e7f927..80a90fa41a 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 880df9f4fc..34d6dc69ca 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 fcc6c5fc5d..4fd8293eb0 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