Skip to content

Commit 6982c38

Browse files
committed
[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
1 parent 2051771 commit 6982c38

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

llvm/lib/Analysis/ConstantFolding.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2306,12 +2306,11 @@ static Constant *ConstantFoldScalarCall1(StringRef Name,
23062306
return nullptr;
23072307
}
23082308

2309-
static Constant *evaluateCompare(const ConstrainedFPIntrinsic *Call) {
2309+
static Constant *evaluateCompare(const APFloat &Op1, const APFloat &Op2,
2310+
const ConstrainedFPIntrinsic *Call) {
23102311
APFloat::opStatus St = APFloat::opOK;
23112312
auto *FCmp = cast<ConstrainedFPCmpIntrinsic>(Call);
23122313
FCmpInst::Predicate Cond = FCmp->getPredicate();
2313-
const APFloat &Op1 = cast<ConstantFP>(FCmp->getOperand(0))->getValueAPF();
2314-
const APFloat &Op2 = cast<ConstantFP>(FCmp->getOperand(1))->getValueAPF();
23152314
if (FCmp->isSignaling()) {
23162315
if (Op1.isNaN() || Op2.isNaN())
23172316
St = APFloat::opInvalidOp;
@@ -2321,7 +2320,7 @@ static Constant *evaluateCompare(const ConstrainedFPIntrinsic *Call) {
23212320
}
23222321
bool Result = FCmpInst::compare(Op1, Op2, Cond);
23232322
if (mayFoldConstrained(const_cast<ConstrainedFPCmpIntrinsic *>(FCmp), St))
2324-
return ConstantInt::get(Call->getType(), Result);
2323+
return ConstantInt::get(Call->getType()->getScalarType(), Result);
23252324
return nullptr;
23262325
}
23272326

@@ -2384,7 +2383,7 @@ static Constant *ConstantFoldScalarCall2(StringRef Name,
23842383
break;
23852384
case Intrinsic::experimental_constrained_fcmp:
23862385
case Intrinsic::experimental_constrained_fcmps:
2387-
return evaluateCompare(ConstrIntr);
2386+
return evaluateCompare(Op1V, Op2V, ConstrIntr);
23882387
}
23892388
if (mayFoldConstrained(const_cast<ConstrainedFPIntrinsic *>(ConstrIntr),
23902389
St))

llvm/test/Transforms/InstSimplify/constfold-constrained.ll

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,16 @@ entry:
438438
ret i1 %result
439439
}
440440

441+
define <2 x i1> @cmp_eq_02a() #0 {
442+
; CHECK-LABEL: @cmp_eq_02a(
443+
; CHECK-NEXT: entry:
444+
; CHECK-NEXT: ret <2 x i1> <i1 true, i1 false>
445+
;
446+
entry:
447+
%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
448+
ret <2 x i1> %result
449+
}
450+
441451
define i1 @cmp_eq_03() #0 {
442452
; CHECK-LABEL: @cmp_eq_03(
443453
; CHECK-NEXT: entry:
@@ -544,5 +554,6 @@ declare double @llvm.experimental.constrained.frem.f64(double, double, metadata,
544554
declare double @llvm.experimental.constrained.fma.f64(double, double, double, metadata, metadata)
545555
declare double @llvm.experimental.constrained.fmuladd.f64(double, double, double, metadata, metadata)
546556
declare i1 @llvm.experimental.constrained.fcmp.f64(double, double, metadata, metadata)
557+
declare <2 x i1> @llvm.experimental.constrained.fcmp.v2f64(<2 x double>, <2 x double>, metadata, metadata)
547558
declare i1 @llvm.experimental.constrained.fcmps.f64(double, double, metadata, metadata)
548559

0 commit comments

Comments
 (0)