From 6bb889cf8454c9ad0e49d14d72876994f993848f Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 19 Feb 2008 06:12:18 +0000 Subject: [PATCH] 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 --- lib/Transforms/Scalar/InstructionCombining.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 5582f511340..9957bc19c69 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/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(Op0)) + // undef / X -> 0 for integer. + // undef / X -> undef for FP (the undef could be a snan). + if (isa(Op0)) { + if (Op0->getType()->isFPOrFPVector()) + return ReplaceInstUsesWith(I, Op0); return ReplaceInstUsesWith(I, Constant::getNullValue(I.getType())); + } // X / undef -> undef if (isa(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(Op0)) if (LHS->isNullValue()) return ReplaceInstUsesWith(I, Constant::getNullValue(I.getType())); - if (isa(Op0)) // undef % X -> 0 + if (isa(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(Op1)) return ReplaceInstUsesWith(I, Op1); // X % undef -> undef