[llvm] c411965 - [SLP]Fix PR61224: Compiler hits infinite loop.
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 6 13:49:42 PST 2023
Author: Alexey Bataev
Date: 2023-03-06T13:46:41-08:00
New Revision: c411965820eb803dd7eac39f80357cad663b7ba0
URL: https://github.com/llvm/llvm-project/commit/c411965820eb803dd7eac39f80357cad663b7ba0
DIFF: https://github.com/llvm/llvm-project/commit/c411965820eb803dd7eac39f80357cad663b7ba0.diff
LOG: [SLP]Fix PR61224: Compiler hits infinite loop.
IRBuilder in many cases is able to fold constant code automatically,
but in some cases (for some intrinsics) it cannot do it. Need to perform
manual calculation, if constant provided in these corner cases, to avoid
infinite loop.
Added:
llvm/test/Transforms/SLPVectorizer/X86/reduce-constants.ll
Modified:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 3eaa627e0244f..20b0360ae1daf 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -12235,6 +12235,7 @@ class HorizontalReduction {
static Value *createOp(IRBuilder<> &Builder, RecurKind Kind, Value *LHS,
Value *RHS, const Twine &Name, bool UseSelect) {
unsigned RdxOpcode = RecurrenceDescriptor::getOpcode(Kind);
+ bool IsConstant = isConstant(LHS) && isConstant(RHS);
switch (Kind) {
case RecurKind::Or:
if (UseSelect &&
@@ -12256,29 +12257,37 @@ class HorizontalReduction {
return Builder.CreateBinOp((Instruction::BinaryOps)RdxOpcode, LHS, RHS,
Name);
case RecurKind::FMax:
+ if (IsConstant)
+ return ConstantFP::get(LHS->getType(),
+ maxnum(cast<ConstantFP>(LHS)->getValueAPF(),
+ cast<ConstantFP>(RHS)->getValueAPF()));
return Builder.CreateBinaryIntrinsic(Intrinsic::maxnum, LHS, RHS);
case RecurKind::FMin:
+ if (IsConstant)
+ return ConstantFP::get(LHS->getType(),
+ minnum(cast<ConstantFP>(LHS)->getValueAPF(),
+ cast<ConstantFP>(RHS)->getValueAPF()));
return Builder.CreateBinaryIntrinsic(Intrinsic::minnum, LHS, RHS);
case RecurKind::SMax:
- if (UseSelect) {
+ if (IsConstant || UseSelect) {
Value *Cmp = Builder.CreateICmpSGT(LHS, RHS, Name);
return Builder.CreateSelect(Cmp, LHS, RHS, Name);
}
return Builder.CreateBinaryIntrinsic(Intrinsic::smax, LHS, RHS);
case RecurKind::SMin:
- if (UseSelect) {
+ if (IsConstant || UseSelect) {
Value *Cmp = Builder.CreateICmpSLT(LHS, RHS, Name);
return Builder.CreateSelect(Cmp, LHS, RHS, Name);
}
return Builder.CreateBinaryIntrinsic(Intrinsic::smin, LHS, RHS);
case RecurKind::UMax:
- if (UseSelect) {
+ if (IsConstant || UseSelect) {
Value *Cmp = Builder.CreateICmpUGT(LHS, RHS, Name);
return Builder.CreateSelect(Cmp, LHS, RHS, Name);
}
return Builder.CreateBinaryIntrinsic(Intrinsic::umax, LHS, RHS);
case RecurKind::UMin:
- if (UseSelect) {
+ if (IsConstant || UseSelect) {
Value *Cmp = Builder.CreateICmpULT(LHS, RHS, Name);
return Builder.CreateSelect(Cmp, LHS, RHS, Name);
}
diff --git a/llvm/test/Transforms/SLPVectorizer/X86/reduce-constants.ll b/llvm/test/Transforms/SLPVectorizer/X86/reduce-constants.ll
new file mode 100644
index 0000000000000..c91b9b0004028
--- /dev/null
+++ b/llvm/test/Transforms/SLPVectorizer/X86/reduce-constants.ll
@@ -0,0 +1,18 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -mtriple=x86_64 -passes=slp-vectorizer < %s | FileCheck %s
+
+define double @test(double %m, double %a) {
+; CHECK-LABEL: @test(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[TMP0:%.*]] = call fast double @llvm.maxnum.f64(double 0.000000e+00, double [[M:%.*]])
+; CHECK-NEXT: [[TMP1:%.*]] = call fast double @llvm.maxnum.f64(double [[TMP0]], double [[A:%.*]])
+; CHECK-NEXT: ret double [[TMP1]]
+;
+entry:
+ %c = tail call fast double @llvm.maxnum.f64(double %m, double 0.000000e+00)
+ %c1 = tail call fast double @llvm.maxnum.f64(double %a, double %c)
+ %c2 = tail call fast double @llvm.maxnum.f64(double %c1, double 0.000000e+00)
+ ret double %c2
+}
+
+declare double @llvm.maxnum.f64(double, double)
More information about the llvm-commits
mailing list