[llvm] 6982c38 - [ConstantFolding] Fix folding of constrained compare intrinsics

Serge Pavlov via llvm-commits llvm-commits at lists.llvm.org
Sat Feb 26 20:01:49 PST 2022


Author: Serge Pavlov
Date: 2022-02-27T10:19:19+07:00
New Revision: 6982c38cb120ec7cd6a895b0363643678e362557

URL: https://github.com/llvm/llvm-project/commit/6982c38cb120ec7cd6a895b0363643678e362557
DIFF: https://github.com/llvm/llvm-project/commit/6982c38cb120ec7cd6a895b0363643678e362557.diff

LOG: [ConstantFolding] Fix folding of constrained compare intrinsics

The change fixes treatment of constrained compare intrinsics if
compared values are of vector type.

Differential revision: https://reviews.llvm.org/D110322

Added: 
    

Modified: 
    llvm/lib/Analysis/ConstantFolding.cpp
    llvm/test/Transforms/InstSimplify/constfold-constrained.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index 2a9ff10c5c271..d318b16d67768 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -2306,12 +2306,11 @@ static Constant *ConstantFoldScalarCall1(StringRef Name,
   return nullptr;
 }
 
-static Constant *evaluateCompare(const ConstrainedFPIntrinsic *Call) {
+static Constant *evaluateCompare(const APFloat &Op1, const APFloat &Op2,
+                                 const ConstrainedFPIntrinsic *Call) {
   APFloat::opStatus St = APFloat::opOK;
   auto *FCmp = cast<ConstrainedFPCmpIntrinsic>(Call);
   FCmpInst::Predicate Cond = FCmp->getPredicate();
-  const APFloat &Op1 = cast<ConstantFP>(FCmp->getOperand(0))->getValueAPF();
-  const APFloat &Op2 = cast<ConstantFP>(FCmp->getOperand(1))->getValueAPF();
   if (FCmp->isSignaling()) {
     if (Op1.isNaN() || Op2.isNaN())
       St = APFloat::opInvalidOp;
@@ -2321,7 +2320,7 @@ static Constant *evaluateCompare(const ConstrainedFPIntrinsic *Call) {
   }
   bool Result = FCmpInst::compare(Op1, Op2, Cond);
   if (mayFoldConstrained(const_cast<ConstrainedFPCmpIntrinsic *>(FCmp), St))
-    return ConstantInt::get(Call->getType(), Result);
+    return ConstantInt::get(Call->getType()->getScalarType(), Result);
   return nullptr;
 }
 
@@ -2384,7 +2383,7 @@ static Constant *ConstantFoldScalarCall2(StringRef Name,
           break;
         case Intrinsic::experimental_constrained_fcmp:
         case Intrinsic::experimental_constrained_fcmps:
-          return evaluateCompare(ConstrIntr);
+          return evaluateCompare(Op1V, Op2V, ConstrIntr);
         }
         if (mayFoldConstrained(const_cast<ConstrainedFPIntrinsic *>(ConstrIntr),
                                St))

diff  --git a/llvm/test/Transforms/InstSimplify/constfold-constrained.ll b/llvm/test/Transforms/InstSimplify/constfold-constrained.ll
index f659b82d9748d..a9ef7f6a765d1 100644
--- a/llvm/test/Transforms/InstSimplify/constfold-constrained.ll
+++ b/llvm/test/Transforms/InstSimplify/constfold-constrained.ll
@@ -438,6 +438,16 @@ entry:
   ret i1 %result
 }
 
+define <2 x i1> @cmp_eq_02a() #0 {
+; CHECK-LABEL: @cmp_eq_02a(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 false>
+;
+entry:
+  %result = call <2 x i1> @llvm.experimental.constrained.fcmp.v2f64(<2 x double> <double 2.0, double 3.0>, <2 x double> <double 2.0, double 2.0>, metadata !"oeq", metadata !"fpexcept.ignore") #0
+  ret <2 x i1> %result
+}
+
 define i1 @cmp_eq_03() #0 {
 ; CHECK-LABEL: @cmp_eq_03(
 ; CHECK-NEXT:  entry:
@@ -544,5 +554,6 @@ declare double @llvm.experimental.constrained.frem.f64(double, double, metadata,
 declare double @llvm.experimental.constrained.fma.f64(double, double, double, metadata, metadata)
 declare double @llvm.experimental.constrained.fmuladd.f64(double, double, double, metadata, metadata)
 declare i1 @llvm.experimental.constrained.fcmp.f64(double, double, metadata, metadata)
+declare <2 x i1> @llvm.experimental.constrained.fcmp.v2f64(<2 x double>, <2 x double>, metadata, metadata)
 declare i1 @llvm.experimental.constrained.fcmps.f64(double, double, metadata, metadata)
 


        


More information about the llvm-commits mailing list