diff options
| author | Reid Spencer <rspencer@reidspencer.com> | 2006-12-01 03:56:30 +0000 |
|---|---|---|
| committer | Reid Spencer <rspencer@reidspencer.com> | 2006-12-01 03:56:30 +0000 |
| commit | 6f05d739385269843442e152a91e8c31e1f68667 (patch) | |
| tree | de6745ca4488622b15e59bf1c104840019035e97 /llvm/lib | |
| parent | 30477cd88e50685d534c273664285a37d7ec5313 (diff) | |
| download | bcm5719-llvm-6f05d739385269843442e152a91e8c31e1f68667.tar.gz bcm5719-llvm-6f05d739385269843442e152a91e8c31e1f68667.zip | |
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.
llvm-svn: 32060
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/VMCore/ConstantFolding.cpp | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/llvm/lib/VMCore/ConstantFolding.cpp b/llvm/lib/VMCore/ConstantFolding.cpp index fd6ad108a9c..a428e74bc66 100644 --- a/llvm/lib/VMCore/ConstantFolding.cpp +++ b/llvm/lib/VMCore/ConstantFolding.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<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 @@ 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<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; |

