[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