// Unsigned integers are always nonnegative.
case Instruction::UIToFP:
return true;
- case Instruction::FMul:
case Instruction::FDiv:
- // X * X is always non-negative or a NaN.
// X / X is always exactly 1.0 or a NaN.
if (I->getOperand(0) == I->getOperand(1) &&
(!SignBitOnly || cast<FPMathOperator>(I)->hasNoNaNs()))
return true;
+ // Set SignBitOnly for RHS, because X / -0.0 is -Inf (or NaN).
+ return cannotBeOrderedLessThanZeroImpl(I->getOperand(0), TLI, SignBitOnly,
+ Depth + 1) &&
+ cannotBeOrderedLessThanZeroImpl(I->getOperand(1), TLI,
+ /*SignBitOnly*/ true, Depth + 1);
+ case Instruction::FMul:
+ // X * X is always non-negative or a NaN.
+ if (I->getOperand(0) == I->getOperand(1) &&
+ (!SignBitOnly || cast<FPMathOperator>(I)->hasNoNaNs()))
+ return true;
+
LLVM_FALLTHROUGH;
case Instruction::FAdd:
case Instruction::FRem:
ret <2 x i1> %cmp
}
-; FIXME: Miscompile.
+; TODO: This could fold to true.
define i1 @pr58046(i64 %arg) {
; CHECK-LABEL: @pr58046(
-; CHECK-NEXT: ret i1 false
+; CHECK-NEXT: [[FP:%.*]] = uitofp i64 [[ARG:%.*]] to double
+; CHECK-NEXT: [[MUL:%.*]] = fmul double -0.000000e+00, [[FP]]
+; CHECK-NEXT: [[DIV:%.*]] = fdiv double 1.000000e+00, [[MUL]]
+; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[DIV]], 0xFFF0000000000000
+; CHECK-NEXT: ret i1 [[CMP]]
;
%fp = uitofp i64 %arg to double
%mul = fmul double -0.000000e+00, %fp