mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-02 07:32:52 +00:00
Do not let MaskedValueIsZero consider undef to be zero, for reasons
explained in the comment. This fixes UnitTests/2003-09-18-BitFieldTest on darwin git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22483 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e884dc2c58
commit
f9944f109c
@ -1317,7 +1317,13 @@ struct FoldSetCCLogical {
|
||||
/// this predicate to simplify operations downstream. V and Mask are known to
|
||||
/// be the same type.
|
||||
static bool MaskedValueIsZero(Value *V, ConstantIntegral *Mask) {
|
||||
if (isa<UndefValue>(V) || Mask->isNullValue())
|
||||
// Note, we cannot consider 'undef' to be "IsZero" here. The problem is that
|
||||
// we cannot optimize based on the assumption that it is zero without changing
|
||||
// to to an explicit zero. If we don't change it to zero, other code could
|
||||
// optimized based on the contradictory assumption that it is non-zero.
|
||||
// Because instcombine aggressively folds operations with undef args anyway,
|
||||
// this won't lose us code quality.
|
||||
if (Mask->isNullValue())
|
||||
return true;
|
||||
if (ConstantIntegral *CI = dyn_cast<ConstantIntegral>(V))
|
||||
return ConstantExpr::getAnd(CI, Mask)->isNullValue();
|
||||
@ -3134,7 +3140,7 @@ Instruction *InstCombiner::visitShiftInst(ShiftInst &I) {
|
||||
return ReplaceInstUsesWith(I, Constant::getNullValue(I.getType()));
|
||||
}
|
||||
if (isa<UndefValue>(Op1)) {
|
||||
if (isLeftShift || I.getType()->isUnsigned())
|
||||
if (isLeftShift || I.getType()->isUnsigned())// X << undef, X >>u undef -> 0
|
||||
return ReplaceInstUsesWith(I, Constant::getNullValue(I.getType()));
|
||||
else
|
||||
return ReplaceInstUsesWith(I, Op0); // X >>s undef -> X
|
||||
|
Loading…
Reference in New Issue
Block a user