Changes in directory llvm/lib/VMCore:
ConstantFold.cpp updated: 1.148 -> 1.149 --- Log message: fold constantexprs more aggressively, fixing PR1265: http://llvm.org/PR1265 --- Diffs of the changes: (+17 -2) ConstantFold.cpp | 19 +++++++++++++++++-- 1 files changed, 17 insertions(+), 2 deletions(-) Index: llvm/lib/VMCore/ConstantFold.cpp diff -u llvm/lib/VMCore/ConstantFold.cpp:1.148 llvm/lib/VMCore/ConstantFold.cpp:1.149 --- llvm/lib/VMCore/ConstantFold.cpp:1.148 Fri Mar 23 00:33:23 2007 +++ llvm/lib/VMCore/ConstantFold.cpp Sun Mar 25 00:47:04 2007 @@ -519,10 +519,20 @@ return Constant::getNullValue(CI->getType()); // X % 1 == 0 break; case Instruction::And: - if (const ConstantInt *CI = dyn_cast<ConstantInt>(C2)) + if (const ConstantInt *CI = dyn_cast<ConstantInt>(C2)) { + if (CI->isZero()) return const_cast<Constant*>(C2); // X & 0 == 0 if (CI->isAllOnesValue()) return const_cast<Constant*>(C1); // X & -1 == X - if (C2->isNullValue()) return const_cast<Constant*>(C2); // X & 0 == 0 + + // (zext i32 to i64) & 4294967295 -> (zext i32 to i64) + if (CE1->getOpcode() == Instruction::ZExt) { + APInt PossiblySetBits + = cast<IntegerType>(CE1->getOperand(0)->getType())->getMask(); + PossiblySetBits.zext(C1->getType()->getPrimitiveSizeInBits()); + if ((PossiblySetBits & CI->getValue()) == PossiblySetBits) + return const_cast<Constant*>(C1); + } + } if (CE1->isCast() && isa<GlobalValue>(CE1->getOperand(0))) { GlobalValue *CPR = cast<GlobalValue>(CE1->getOperand(0)); @@ -543,6 +553,11 @@ case Instruction::Xor: if (C2->isNullValue()) return const_cast<Constant*>(C1); // X ^ 0 == X break; + case Instruction::AShr: + if (CE1->getOpcode() == Instruction::ZExt) // Top bits known zero. + return ConstantExpr::getLShr(const_cast<Constant*>(C1), + const_cast<Constant*>(C2)); + break; } } } else if (isa<ConstantExpr>(C2)) { _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits