From b8611ec8bcf4a24042824f5ddc9858e32c56dc2e Mon Sep 17 00:00:00 2001 From: Reid Spencer Date: Fri, 1 Dec 2006 03:56:30 +0000 Subject: [PATCH] Don't fold "ptrtoint GV to bool" since this should be doing a truncate not a comparison against zero. Instead fold setne(GV,null) and seteq(GV,null) to ConstantBool::True or ConstantBool::False, respectively. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32060 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/VMCore/ConstantFold.cpp | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp index fd6ad108a9c..a428e74bc66 100644 --- a/lib/VMCore/ConstantFold.cpp +++ b/lib/VMCore/ConstantFold.cpp @@ -893,11 +893,6 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, const Constant *V, break; case Instruction::PtrToInt: - // Cast of a global address to boolean is always true. - if (const GlobalValue *GV = dyn_cast(V)) { - if (DestTy == Type::BoolTy && !GV->hasExternalWeakLinkage()) - return ConstantBool::getTrue(); - } break; case Instruction::BitCast: // Check to see if we are casting a pointer to an aggregate to a pointer to @@ -1371,10 +1366,35 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode, case Instruction::Shl: C = ConstRules::get(V1, V2).shl(V1, V2); break; case Instruction::LShr: C = ConstRules::get(V1, V2).lshr(V1, V2); break; case Instruction::AShr: C = ConstRules::get(V1, V2).ashr(V1, V2); break; - case Instruction::SetEQ: C = ConstRules::get(V1, V2).equalto(V1, V2); break; + case Instruction::SetEQ: + // SetEQ(null,GV) -> false + if (V1->isNullValue()) { + if (const GlobalValue *GV = dyn_cast(V2)) + if (!GV->hasExternalWeakLinkage()) + return ConstantBool::getFalse(); + // SetEQ(GV,null) -> false + } else if (V2->isNullValue()) { + if (const GlobalValue *GV = dyn_cast(V1)) + if (!GV->hasExternalWeakLinkage()) + return ConstantBool::getFalse(); + } + C = ConstRules::get(V1, V2).equalto(V1, V2); + break; case Instruction::SetLT: C = ConstRules::get(V1, V2).lessthan(V1, V2);break; case Instruction::SetGT: C = ConstRules::get(V1, V2).lessthan(V2, V1);break; - case Instruction::SetNE: // V1 != V2 === !(V1 == V2) + case Instruction::SetNE: + // SetNE(null,GV) -> true + if (V1->isNullValue()) { + if (const GlobalValue *GV = dyn_cast(V2)) + if (!GV->hasExternalWeakLinkage()) + return ConstantBool::getTrue(); + // SetNE(GV,null) -> true + } else if (V2->isNullValue()) { + if (const GlobalValue *GV = dyn_cast(V1)) + if (!GV->hasExternalWeakLinkage()) + return ConstantBool::getTrue(); + } + // V1 != V2 === !(V1 == V2) C = ConstRules::get(V1, V2).equalto(V1, V2); if (C) return ConstantExpr::getNot(C); break;