[InstCombine] add fold for fabs(X) u< 0.0
authorSanjay Patel <spatel@rotateright.com>
Wed, 7 Nov 2018 15:11:32 +0000 (15:11 +0000)
committerSanjay Patel <spatel@rotateright.com>
Wed, 7 Nov 2018 15:11:32 +0000 (15:11 +0000)
The sibling fold for 'oge' --> 'ord' was already here,
but this half was missing.

The result of fabs() must be positive or nan, so asking
if the result is negative or nan is the same as asking
if the result is nan.

This is another step towards fixing:
https://bugs.llvm.org/show_bug.cgi?id=39475

llvm-svn: 346321

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
llvm/test/Transforms/InstCombine/fcmp.ll

index c6dbfd92844064340f1ad1c071237fd9d19244c2..d516422232114cf1a99ebd3b21248629c635feb3 100644 (file)
@@ -5311,6 +5311,11 @@ static Instruction *foldFabsWithFcmpZero(FCmpInst &I) {
     assert(!I.hasNoNaNs() && "fcmp should have simplified");
     return new FCmpInst(FCmpInst::FCMP_ORD, X, I.getOperand(1));
 
+  case FCmpInst::FCMP_ULT:
+    // fabs(X) u< 0.0 --> isnan(X)
+    assert(!I.hasNoNaNs() && "fcmp should have simplified");
+    return new FCmpInst(FCmpInst::FCMP_UNO, X, I.getOperand(1));
+
   case FCmpInst::FCMP_OEQ:
   case FCmpInst::FCMP_UEQ:
   case FCmpInst::FCMP_ONE:
index e14a56bbcb24f610e3f8edafd97289eda589747f..c49ed262ab8ed28acbfbece7704d835687df1bce 100644 (file)
@@ -219,8 +219,7 @@ define i1 @fabs_oge(double %a) {
 
 define i1 @fabs_ult(double %a) {
 ; CHECK-LABEL: @fabs_ult(
-; CHECK-NEXT:    [[CALL:%.*]] = call double @llvm.fabs.f64(double [[A:%.*]])
-; CHECK-NEXT:    [[CMP:%.*]] = fcmp reassoc arcp ult double [[CALL]], 0.000000e+00
+; CHECK-NEXT:    [[CMP:%.*]] = fcmp uno double [[A:%.*]], 0.000000e+00
 ; CHECK-NEXT:    ret i1 [[CMP]]
 ;
   %call = call double @llvm.fabs.f64(double %a)