OSDN Git Service

[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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@346321 91177308-0d34-0410-b5e6-96231b3b80d8

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

index c6dbfd9..d516422 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 e14a56b..c49ed26 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)