Changes in directory llvm/lib/VMCore:
ConstantFolding.cpp updated: 1.101 -> 1.102 --- Log message: 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. --- Diffs of the changes: (+27 -7) ConstantFolding.cpp | 34 +++++++++++++++++++++++++++------- 1 files changed, 27 insertions(+), 7 deletions(-) Index: llvm/lib/VMCore/ConstantFolding.cpp diff -u llvm/lib/VMCore/ConstantFolding.cpp:1.101 llvm/lib/VMCore/ConstantFolding.cpp:1.102 --- llvm/lib/VMCore/ConstantFolding.cpp:1.101 Thu Nov 30 18:25:12 2006 +++ llvm/lib/VMCore/ConstantFolding.cpp Thu Nov 30 21:56:30 2006 @@ -893,11 +893,6 @@ break; case Instruction::PtrToInt: - // Cast of a global address to boolean is always true. - if (const GlobalValue *GV = dyn_cast<GlobalValue>(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 @@ 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<GlobalValue>(V2)) + if (!GV->hasExternalWeakLinkage()) + return ConstantBool::getFalse(); + // SetEQ(GV,null) -> false + } else if (V2->isNullValue()) { + if (const GlobalValue *GV = dyn_cast<GlobalValue>(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<GlobalValue>(V2)) + if (!GV->hasExternalWeakLinkage()) + return ConstantBool::getTrue(); + // SetNE(GV,null) -> true + } else if (V2->isNullValue()) { + if (const GlobalValue *GV = dyn_cast<GlobalValue>(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; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits