mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-29 22:50:47 +00:00
fold constantexprs more aggressively, fixing PR1265
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35336 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7177c3a60a
commit
2ef14d9f7c
@ -519,10 +519,20 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode,
|
||||
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 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode,
|
||||
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)) {
|
||||
|
Loading…
Reference in New Issue
Block a user