aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ValueTracking.cpp
diff options
context:
space:
mode:
authorAlexey Bader <alexey.bader@intel.com>2024-10-15 11:05:16 -0700
committerGitHub <noreply@github.com>2024-10-15 22:05:16 +0400
commit583fa4f5b7c1d114d44cfe8c357e1c12a0d0544e (patch)
tree7353e739c93c5826e133931e1759566ae2976961 /llvm/lib/Analysis/ValueTracking.cpp
parent060d151476b871b48662dbd1947b67d9b0ae9d13 (diff)
downloadllvm-583fa4f5b7c1d114d44cfe8c357e1c12a0d0544e.zip
llvm-583fa4f5b7c1d114d44cfe8c357e1c12a0d0544e.tar.gz
llvm-583fa4f5b7c1d114d44cfe8c357e1c12a0d0544e.tar.bz2
[InstCombine] Extend fcmp+select folding to minnum/maxnum intrinsics (#112088)
Today, InstCombine can fold fcmp+select patterns to minnum/maxnum intrinsics when the nnan and nsz flags are set. The ordering of the operands in both the fcmp and select instructions is important for the folding to occur. maxnum patterns: 1. (a op b) ? a : b -> maxnum(a, b), where op is one of {ogt, oge} 2. (a op b) ? b : a -> maxnum(a, b), where op is one of {ule, ult} The second pattern is supposed to make the order of the operands in the select instruction irrelevant. However, the pattern matching code uses the CmpInst::getInversePredicate method to invert the comparison predicate. This method doesn't take into account the fast-math flags, which can lead missing the folding opportunity. The patch extends the pattern matching code to handle unordered fcmp instructions. This allows the folding to occur even when the select instruction has the operands in the inverse order. New maxnum patterns: 1. (a op b) ? a : b -> maxnum(a, b), where op is one of {ugt, uge} 2. (a op b) ? b : a -> maxnum(a, b), where op is one of {ole, olt} The same changes are applied to the minnum intrinsic.
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r--llvm/lib/Analysis/ValueTracking.cpp8
1 files changed, 2 insertions, 6 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index c71d170..eb8d170 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -8248,9 +8248,7 @@ static SelectPatternResult matchFastFloatClamp(CmpInst::Predicate Pred,
case CmpInst::FCMP_OLE:
case CmpInst::FCMP_ULT:
case CmpInst::FCMP_ULE:
- if (match(FalseVal,
- m_CombineOr(m_OrdFMin(m_Specific(CmpLHS), m_APFloat(FC2)),
- m_UnordFMin(m_Specific(CmpLHS), m_APFloat(FC2)))) &&
+ if (match(FalseVal, m_OrdOrUnordFMin(m_Specific(CmpLHS), m_APFloat(FC2))) &&
*FC1 < *FC2)
return {SPF_FMAXNUM, SPNB_RETURNS_ANY, false};
break;
@@ -8258,9 +8256,7 @@ static SelectPatternResult matchFastFloatClamp(CmpInst::Predicate Pred,
case CmpInst::FCMP_OGE:
case CmpInst::FCMP_UGT:
case CmpInst::FCMP_UGE:
- if (match(FalseVal,
- m_CombineOr(m_OrdFMax(m_Specific(CmpLHS), m_APFloat(FC2)),
- m_UnordFMax(m_Specific(CmpLHS), m_APFloat(FC2)))) &&
+ if (match(FalseVal, m_OrdOrUnordFMax(m_Specific(CmpLHS), m_APFloat(FC2))) &&
*FC1 > *FC2)
return {SPF_FMINNUM, SPNB_RETURNS_ANY, false};
break;