diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-07-20 18:49:28 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-07-20 18:49:28 +0000 |
| commit | 18aa4d81965eff7a63c23520a78de925bf5fd80d (patch) | |
| tree | c85853ba1dabba9b3a4855b8a96dd47e96831dec | |
| parent | 05732c86d49e6595dd0ea0c23af4817895dcbb70 (diff) | |
| download | bcm5719-llvm-18aa4d81965eff7a63c23520a78de925bf5fd80d.tar.gz bcm5719-llvm-18aa4d81965eff7a63c23520a78de925bf5fd80d.zip | |
Do not let MaskedValueIsZero consider undef to be zero, for reasons
explained in the comment.
This fixes UnitTests/2003-09-18-BitFieldTest on darwin
llvm-svn: 22483
| -rw-r--r-- | llvm/lib/Transforms/Scalar/InstructionCombining.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index b838289e59c..41b8f3bc29e 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp @@ -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 |

