diff options
author | Chris Lattner <sabre@nondot.org> | 2008-02-19 06:12:18 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-02-19 06:12:18 +0000 |
commit | 0fe6bce9ce6412688971c55b61bdd1466f714531 (patch) | |
tree | 87691661b4e9befd0cebf28b8f1d67effbc4d091 /llvm/lib/Transforms | |
parent | 5f9f34d07041b3a28e0cae9abee5f5f7af1c9326 (diff) | |
download | bcm5719-llvm-0fe6bce9ce6412688971c55b61bdd1466f714531.tar.gz bcm5719-llvm-0fe6bce9ce6412688971c55b61bdd1466f714531.zip |
fdiv/frem of undef can produce undef, because the undef operand
can be a SNaN. We could be more aggressive and turn this into
unreachable, but that is less nice, and not really worth it.
llvm-svn: 47313
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Scalar/InstructionCombining.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index 5582f511340..9957bc19c69 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp @@ -2590,9 +2590,13 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) { Instruction *InstCombiner::commonDivTransforms(BinaryOperator &I) { Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); - // undef / X -> 0 - if (isa<UndefValue>(Op0)) + // undef / X -> 0 for integer. + // undef / X -> undef for FP (the undef could be a snan). + if (isa<UndefValue>(Op0)) { + if (Op0->getType()->isFPOrFPVector()) + return ReplaceInstUsesWith(I, Op0); return ReplaceInstUsesWith(I, Constant::getNullValue(I.getType())); + } // X / undef -> undef if (isa<UndefValue>(Op1)) @@ -2821,13 +2825,16 @@ static Constant *GetFactor(Value *V) { Instruction *InstCombiner::commonRemTransforms(BinaryOperator &I) { Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); - // 0 % X == 0, we don't need to preserve faults! + // 0 % X == 0 for integer, we don't need to preserve faults! if (Constant *LHS = dyn_cast<Constant>(Op0)) if (LHS->isNullValue()) return ReplaceInstUsesWith(I, Constant::getNullValue(I.getType())); - if (isa<UndefValue>(Op0)) // undef % X -> 0 + if (isa<UndefValue>(Op0)) { // undef % X -> 0 + if (I.getType()->isFPOrFPVector()) + return ReplaceInstUsesWith(I, Op0); // X % undef -> undef (could be SNaN) return ReplaceInstUsesWith(I, Constant::getNullValue(I.getType())); + } if (isa<UndefValue>(Op1)) return ReplaceInstUsesWith(I, Op1); // X % undef -> undef |