[llvm] [InstSimplify] Only handle canonical forms in `simplifyAndOrOfFCmps`. NFC. (PR #98136)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 9 02:25:28 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-analysis
Author: Yingwei Zheng (dtcxzyw)
<details>
<summary>Changes</summary>
This patch avoids calling `isKnownNeverNaN` in `simplifyAndOrOfFCmps` since `fcmp ord/uno X, NNAN` will be canonicalized into `fcmp ord/uno X, 0.0` in InstCombine.
---
Full diff: https://github.com/llvm/llvm-project/pull/98136.diff
2 Files Affected:
- (modified) llvm/lib/Analysis/InstructionSimplify.cpp (+10-16)
- (modified) llvm/test/Transforms/InstSimplify/logic-of-fcmps.ll (+1-1)
``````````diff
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 1b72f151e3692..45d9f45d6f4e4 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -1872,14 +1872,11 @@ static Value *simplifyAndOrOfFCmps(const SimplifyQuery &Q, FCmpInst *LHS,
if ((PredL == FCmpInst::FCMP_ORD || PredL == FCmpInst::FCMP_UNO) &&
((FCmpInst::isOrdered(PredR) && IsAnd) ||
(FCmpInst::isUnordered(PredR) && !IsAnd))) {
- // (fcmp ord X, NNAN) & (fcmp o** X, Y) --> fcmp o** X, Y
- // (fcmp uno X, NNAN) & (fcmp o** X, Y) --> false
- // (fcmp uno X, NNAN) | (fcmp u** X, Y) --> fcmp u** X, Y
- // (fcmp ord X, NNAN) | (fcmp u** X, Y) --> true
- if (((LHS1 == RHS0 || LHS1 == RHS1) &&
- isKnownNeverNaN(LHS0, /*Depth=*/0, Q)) ||
- ((LHS0 == RHS0 || LHS0 == RHS1) &&
- isKnownNeverNaN(LHS1, /*Depth=*/0, Q)))
+ // (fcmp ord X, 0) & (fcmp o** X, Y) --> fcmp o** X, Y
+ // (fcmp uno X, 0) & (fcmp o** X, Y) --> false
+ // (fcmp uno X, 0) | (fcmp u** X, Y) --> fcmp u** X, Y
+ // (fcmp ord X, 0) | (fcmp u** X, Y) --> true
+ if ((LHS0 == RHS0 || LHS0 == RHS1) && match(LHS1, m_PosZeroFP()))
return FCmpInst::isOrdered(PredL) == FCmpInst::isOrdered(PredR)
? static_cast<Value *>(RHS)
: ConstantInt::getBool(LHS->getType(), !IsAnd);
@@ -1888,14 +1885,11 @@ static Value *simplifyAndOrOfFCmps(const SimplifyQuery &Q, FCmpInst *LHS,
if ((PredR == FCmpInst::FCMP_ORD || PredR == FCmpInst::FCMP_UNO) &&
((FCmpInst::isOrdered(PredL) && IsAnd) ||
(FCmpInst::isUnordered(PredL) && !IsAnd))) {
- // (fcmp o** X, Y) & (fcmp ord X, NNAN) --> fcmp o** X, Y
- // (fcmp o** X, Y) & (fcmp uno X, NNAN) --> false
- // (fcmp u** X, Y) | (fcmp uno X, NNAN) --> fcmp u** X, Y
- // (fcmp u** X, Y) | (fcmp ord X, NNAN) --> true
- if (((RHS1 == LHS0 || RHS1 == LHS1) &&
- isKnownNeverNaN(RHS0, /*Depth=*/0, Q)) ||
- ((RHS0 == LHS0 || RHS0 == LHS1) &&
- isKnownNeverNaN(RHS1, /*Depth=*/0, Q)))
+ // (fcmp o** X, Y) & (fcmp ord X, 0) --> fcmp o** X, Y
+ // (fcmp o** X, Y) & (fcmp uno X, 0) --> false
+ // (fcmp u** X, Y) | (fcmp uno X, 0) --> fcmp u** X, Y
+ // (fcmp u** X, Y) | (fcmp ord X, 0) --> true
+ if ((RHS0 == LHS0 || RHS0 == LHS1) && match(RHS1, m_PosZeroFP()))
return FCmpInst::isOrdered(PredL) == FCmpInst::isOrdered(PredR)
? static_cast<Value *>(LHS)
: ConstantInt::getBool(LHS->getType(), !IsAnd);
diff --git a/llvm/test/Transforms/InstSimplify/logic-of-fcmps.ll b/llvm/test/Transforms/InstSimplify/logic-of-fcmps.ll
index 4b2ff1b3d050c..3a8bf53b32cab 100644
--- a/llvm/test/Transforms/InstSimplify/logic-of-fcmps.ll
+++ b/llvm/test/Transforms/InstSimplify/logic-of-fcmps.ll
@@ -1,5 +1,5 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
+; RUN: opt < %s -passes=instcombine -S | FileCheck %s
; Cycle through commuted variants where one operand of fcmp ord/uno is
; known not-a-NAN and the other is repeated in the logically-connected fcmp.
``````````
</details>
https://github.com/llvm/llvm-project/pull/98136
More information about the llvm-commits
mailing list