aboutsummaryrefslogtreecommitdiff
path: root/lib/VMCore/ConstantFold.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-05-03 20:09:52 +0000
committerChris Lattner <sabre@nondot.org>2002-05-03 20:09:52 +0000
commit905f311d051496023e31fa8ba98db4f5b8f54c17 (patch)
tree1c7c917cb194fca3782fa4810d7b452365dcfb71 /lib/VMCore/ConstantFold.cpp
parentb6df79a6b28dd051e84c2549b5d1735cb11b54c9 (diff)
Fix bug: test/Regression/Transforms/SCCP/2002-05-03-NotOperator.ll
by using the ~ operator instead of ! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2458 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/ConstantFold.cpp')
-rw-r--r--lib/VMCore/ConstantFold.cpp38
1 files changed, 26 insertions, 12 deletions
diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp
index 2f1fe5f802..8edcb42530 100644
--- a/lib/VMCore/ConstantFold.cpp
+++ b/lib/VMCore/ConstantFold.cpp
@@ -225,6 +225,8 @@ struct PointerRules : public TemplateRules<ConstantPointer, PointerRules> {
inline static ConstantPointer *CastToPointer(const ConstantPointer *V,
const PointerType *PTy) {
+ if (V->getType() == PTy)
+ return const_cast<ConstantPointer*>(V); // Allow cast %PTy %ptr to %PTy
if (V->isNullValue())
return ConstantPointerNull::get(PTy);
return 0; // Can't const prop other types of pointers
@@ -245,10 +247,6 @@ struct DirectRules
: public TemplateRules<ConstantClass,
DirectRules<ConstantClass, BuiltinType, Ty> > {
- inline static Constant *Not(const ConstantClass *V) {
- return ConstantClass::get(*Ty, !(BuiltinType)V->getValue());;
- }
-
inline static Constant *Add(const ConstantClass *V1,
const ConstantClass *V2) {
BuiltinType Result = (BuiltinType)V1->getValue() +
@@ -310,6 +308,22 @@ struct DirectRules
#undef DEF_CAST
};
+
+//===----------------------------------------------------------------------===//
+// DirectIntRules Class
+//===----------------------------------------------------------------------===//
+//
+// DirectIntRules provides implementations of functions that are valid on
+// integer types, but not all types in general.
+//
+template <class ConstantClass, class BuiltinType, Type **Ty>
+struct DirectIntRules : public DirectRules<ConstantClass, BuiltinType, Ty> {
+ inline static Constant *Not(const ConstantClass *V) {
+ return ConstantClass::get(*Ty, ~(BuiltinType)V->getValue());;
+ }
+};
+
+
//===----------------------------------------------------------------------===//
// DirectRules Subclasses
//===----------------------------------------------------------------------===//
@@ -330,21 +344,21 @@ Annotation *ConstRules::find(AnnotationID AID, const Annotable *TyA, void *) {
case Type::BoolTyID: return new BoolRules();
case Type::PointerTyID: return new PointerRules();
case Type::SByteTyID:
- return new DirectRules<ConstantSInt, signed char , &Type::SByteTy>();
+ return new DirectIntRules<ConstantSInt, signed char , &Type::SByteTy>();
case Type::UByteTyID:
- return new DirectRules<ConstantUInt, unsigned char , &Type::UByteTy>();
+ return new DirectIntRules<ConstantUInt, unsigned char , &Type::UByteTy>();
case Type::ShortTyID:
- return new DirectRules<ConstantSInt, signed short, &Type::ShortTy>();
+ return new DirectIntRules<ConstantSInt, signed short, &Type::ShortTy>();
case Type::UShortTyID:
- return new DirectRules<ConstantUInt, unsigned short, &Type::UShortTy>();
+ return new DirectIntRules<ConstantUInt, unsigned short, &Type::UShortTy>();
case Type::IntTyID:
- return new DirectRules<ConstantSInt, signed int , &Type::IntTy>();
+ return new DirectIntRules<ConstantSInt, signed int , &Type::IntTy>();
case Type::UIntTyID:
- return new DirectRules<ConstantUInt, unsigned int , &Type::UIntTy>();
+ return new DirectIntRules<ConstantUInt, unsigned int , &Type::UIntTy>();
case Type::LongTyID:
- return new DirectRules<ConstantSInt, int64_t , &Type::LongTy>();
+ return new DirectIntRules<ConstantSInt, int64_t , &Type::LongTy>();
case Type::ULongTyID:
- return new DirectRules<ConstantUInt, uint64_t , &Type::ULongTy>();
+ return new DirectIntRules<ConstantUInt, uint64_t , &Type::ULongTy>();
case Type::FloatTyID:
return new DirectRules<ConstantFP , float , &Type::FloatTy>();
case Type::DoubleTyID: