[llvm] [IVDescriptors][NFC] Refactor getReductionOpChain to remove the dependency of non-arithmetic reductions on getOpcode. (PR #118777)
Mel Chen via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 3 00:21:44 PST 2025
https://github.com/Mel-Chen updated https://github.com/llvm/llvm-project/pull/118777
>From 5270a69f038eac759b53a2de5cec9a485883cf2b Mon Sep 17 00:00:00 2001
From: Mel Chen <mel.chen at sifive.com>
Date: Thu, 5 Dec 2024 01:34:22 -0800
Subject: [PATCH 1/3] [IVDescriptors][NFC] Refactor getReductionOpChain to
remove the dependency of non-arithmetic reductions on getOpcode.
---
llvm/include/llvm/Analysis/IVDescriptors.h | 3 +++
llvm/lib/Analysis/IVDescriptors.cpp | 15 ++++++++++-----
2 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/llvm/include/llvm/Analysis/IVDescriptors.h b/llvm/include/llvm/Analysis/IVDescriptors.h
index e8041e22b031ce..458a342de5d772 100644
--- a/llvm/include/llvm/Analysis/IVDescriptors.h
+++ b/llvm/include/llvm/Analysis/IVDescriptors.h
@@ -230,6 +230,9 @@ class RecurrenceDescriptor {
/// Returns true if the recurrence kind is a floating point kind.
static bool isFloatingPointRecurrenceKind(RecurKind Kind);
+ /// Returns true if the recurrence kind is arithmetic.
+ static bool isArithmeticRecurrenceKind(RecurKind Kind);
+
/// Returns true if the recurrence kind is an integer min/max kind.
static bool isIntMinMaxRecurrenceKind(RecurKind Kind) {
return Kind == RecurKind::UMin || Kind == RecurKind::UMax ||
diff --git a/llvm/lib/Analysis/IVDescriptors.cpp b/llvm/lib/Analysis/IVDescriptors.cpp
index f74ede4450ce52..a2ec15045a051a 100644
--- a/llvm/lib/Analysis/IVDescriptors.cpp
+++ b/llvm/lib/Analysis/IVDescriptors.cpp
@@ -62,6 +62,11 @@ bool RecurrenceDescriptor::isFloatingPointRecurrenceKind(RecurKind Kind) {
return (Kind != RecurKind::None) && !isIntegerRecurrenceKind(Kind);
}
+bool RecurrenceDescriptor::isArithmeticRecurrenceKind(RecurKind Kind) {
+ return (Kind != RecurKind::None) && !isMinMaxRecurrenceKind(Kind) &&
+ !isAnyOfRecurrenceKind(Kind);
+}
+
/// Determines if Phi may have been type-promoted. If Phi has a single user
/// that ANDs the Phi with a type mask, return the user. RT is updated to
/// account for the narrower bit width represented by the mask, and the AND
@@ -1166,7 +1171,7 @@ unsigned RecurrenceDescriptor::getOpcode(RecurKind Kind) {
SmallVector<Instruction *, 4>
RecurrenceDescriptor::getReductionOpChain(PHINode *Phi, Loop *L) const {
SmallVector<Instruction *, 4> ReductionOperations;
- unsigned RedOp = getOpcode();
+ bool IsArithmetic = isArithmeticRecurrenceKind(Kind);
// Search down from the Phi to the LoopExitInstr, looking for instructions
// with a single user of the correct type for the reduction.
@@ -1184,7 +1189,7 @@ RecurrenceDescriptor::getReductionOpChain(PHINode *Phi, Loop *L) const {
// more expensive than out-of-loop reductions, and need to be costed more
// carefully.
unsigned ExpectedUses = 1;
- if (RedOp == Instruction::ICmp || RedOp == Instruction::FCmp)
+ if (!IsArithmetic)
ExpectedUses = 2;
auto getNextInstruction = [&](Instruction *Cur) -> Instruction * {
@@ -1192,7 +1197,7 @@ RecurrenceDescriptor::getReductionOpChain(PHINode *Phi, Loop *L) const {
Instruction *UI = cast<Instruction>(User);
if (isa<PHINode>(UI))
continue;
- if (RedOp == Instruction::ICmp || RedOp == Instruction::FCmp) {
+ if (!IsArithmetic) {
// We are expecting a icmp/select pair, which we go to the next select
// instruction if we can. We already know that Cur has 2 uses.
if (isa<SelectInst>(UI))
@@ -1204,7 +1209,7 @@ RecurrenceDescriptor::getReductionOpChain(PHINode *Phi, Loop *L) const {
return nullptr;
};
auto isCorrectOpcode = [&](Instruction *Cur) {
- if (RedOp == Instruction::ICmp || RedOp == Instruction::FCmp) {
+ if (!IsArithmetic) {
Value *LHS, *RHS;
return SelectPatternResult::isMinOrMax(
matchSelectPattern(Cur, LHS, RHS).Flavor);
@@ -1213,7 +1218,7 @@ RecurrenceDescriptor::getReductionOpChain(PHINode *Phi, Loop *L) const {
if (isFMulAddIntrinsic(Cur))
return true;
- return Cur->getOpcode() == RedOp;
+ return Cur->getOpcode() == getOpcode();
};
// Attempt to look through Phis which are part of the reduction chain
>From 45ebdc0f532101e13cd599dfaff8d9df9633ef63 Mon Sep 17 00:00:00 2001
From: Mel Chen <mel.chen at sifive.com>
Date: Thu, 5 Dec 2024 23:16:24 -0800
Subject: [PATCH 2/3] Change the variable name
---
llvm/lib/Analysis/IVDescriptors.cpp | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/llvm/lib/Analysis/IVDescriptors.cpp b/llvm/lib/Analysis/IVDescriptors.cpp
index a2ec15045a051a..f6c6e9f870da6a 100644
--- a/llvm/lib/Analysis/IVDescriptors.cpp
+++ b/llvm/lib/Analysis/IVDescriptors.cpp
@@ -1171,7 +1171,7 @@ unsigned RecurrenceDescriptor::getOpcode(RecurKind Kind) {
SmallVector<Instruction *, 4>
RecurrenceDescriptor::getReductionOpChain(PHINode *Phi, Loop *L) const {
SmallVector<Instruction *, 4> ReductionOperations;
- bool IsArithmetic = isArithmeticRecurrenceKind(Kind);
+ bool IsNonArithmetic = !isArithmeticRecurrenceKind(Kind);
// Search down from the Phi to the LoopExitInstr, looking for instructions
// with a single user of the correct type for the reduction.
@@ -1189,7 +1189,7 @@ RecurrenceDescriptor::getReductionOpChain(PHINode *Phi, Loop *L) const {
// more expensive than out-of-loop reductions, and need to be costed more
// carefully.
unsigned ExpectedUses = 1;
- if (!IsArithmetic)
+ if (IsNonArithmetic)
ExpectedUses = 2;
auto getNextInstruction = [&](Instruction *Cur) -> Instruction * {
@@ -1197,7 +1197,7 @@ RecurrenceDescriptor::getReductionOpChain(PHINode *Phi, Loop *L) const {
Instruction *UI = cast<Instruction>(User);
if (isa<PHINode>(UI))
continue;
- if (!IsArithmetic) {
+ if (IsNonArithmetic) {
// We are expecting a icmp/select pair, which we go to the next select
// instruction if we can. We already know that Cur has 2 uses.
if (isa<SelectInst>(UI))
@@ -1209,7 +1209,7 @@ RecurrenceDescriptor::getReductionOpChain(PHINode *Phi, Loop *L) const {
return nullptr;
};
auto isCorrectOpcode = [&](Instruction *Cur) {
- if (!IsArithmetic) {
+ if (IsNonArithmetic) {
Value *LHS, *RHS;
return SelectPatternResult::isMinOrMax(
matchSelectPattern(Cur, LHS, RHS).Flavor);
>From 8dd7cde1b09f75e8183dae738e8f86828da18072 Mon Sep 17 00:00:00 2001
From: Mel Chen <mel.chen at sifive.com>
Date: Wed, 1 Jan 2025 23:05:39 -0800
Subject: [PATCH 3/3] Assert RecurKind is None
---
llvm/lib/Analysis/IVDescriptors.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/llvm/lib/Analysis/IVDescriptors.cpp b/llvm/lib/Analysis/IVDescriptors.cpp
index f6c6e9f870da6a..a31c5013b309f5 100644
--- a/llvm/lib/Analysis/IVDescriptors.cpp
+++ b/llvm/lib/Analysis/IVDescriptors.cpp
@@ -1171,6 +1171,7 @@ unsigned RecurrenceDescriptor::getOpcode(RecurKind Kind) {
SmallVector<Instruction *, 4>
RecurrenceDescriptor::getReductionOpChain(PHINode *Phi, Loop *L) const {
SmallVector<Instruction *, 4> ReductionOperations;
+ assert(Kind != RecurKind::None && "Unexpected recurrence kind");
bool IsNonArithmetic = !isArithmeticRecurrenceKind(Kind);
// Search down from the Phi to the LoopExitInstr, looking for instructions
More information about the llvm-commits
mailing list