mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-13 04:38:24 +00:00
InstCombine, InstSimplify: (%X /s C1) /s C2 isn't always 0 when C1 * C2 overflow
consider: C1 = INT_MIN C2 = -1 C1 * C2 overflows without a doubt but consider the following: %x = i32 INT_MIN This means that (%X /s C1) is 1 and (%X /s C1) /s C2 is -1. N. B. Move the unsigned version of this transform to InstSimplify, it doesn't create any new instructions. This fixes PR21243. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219567 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -1057,6 +1057,16 @@ static Value *SimplifyDiv(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1,
|
||||
(!isSigned && match(Op0, m_URem(m_Value(), m_Specific(Op1)))))
|
||||
return Constant::getNullValue(Op0->getType());
|
||||
|
||||
// (X /u C1) /u C2 -> 0 if C1 * C2 overflow
|
||||
ConstantInt *C1, *C2;
|
||||
if (!isSigned && match(Op0, m_UDiv(m_Value(X), m_ConstantInt(C1))) &&
|
||||
match(Op1, m_ConstantInt(C2))) {
|
||||
bool Overflow;
|
||||
C1->getValue().umul_ov(C2->getValue(), Overflow);
|
||||
if (Overflow)
|
||||
return Constant::getNullValue(Op0->getType());
|
||||
}
|
||||
|
||||
// If the operation is with the result of a select instruction, check whether
|
||||
// operating on either branch of the select always yields the same value.
|
||||
if (isa<SelectInst>(Op0) || isa<SelectInst>(Op1))
|
||||
|
Reference in New Issue
Block a user