aboutsummaryrefslogtreecommitdiffstats
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)
downloadexternal_llvm-a11564335749cd259d8a1391be34c1abbe302c42.zip
external_llvm-a11564335749cd259d8a1391be34c1abbe302c42.tar.gz
external_llvm-a11564335749cd259d8a1391be34c1abbe302c42.tar.bz2
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 04f3660..9f07c1a 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 77f5e38..120b9f5 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 a9cfcc0..d82b278 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 a0c49bd..26fc426 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 0d1c248..06def88 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 0b19832..6460aa8 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 8359a76..32c10c8 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 e55a85e..96e73d6 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 ef21140..031012a 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 69e7e7f..80a90fa 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 880df9f..34d6dc6 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 fcc6c5f..4fd8293 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