[llvm] [Reassociate] Move Disjoint flag handling to OverflowTracking. (PR #140406)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Fri May 23 05:20:41 PDT 2025
https://github.com/fhahn updated https://github.com/llvm/llvm-project/pull/140406
>From fc13f3342ffbf1198ab1efd11a73bb61be88ae3f Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Sat, 17 May 2025 20:51:44 +0100
Subject: [PATCH] [Reassociate] Move Disjoint flag handling to
OverflowTracking.
Move disjoint flag tracking to OverflowTracking. This enables preserving
disjoint flags in Reassociate.
Depends on https://github.com/llvm/llvm-project/pull/140404
---
llvm/include/llvm/Transforms/Utils/Local.h | 1 +
llvm/lib/Transforms/Scalar/LICM.cpp | 7 -------
llvm/lib/Transforms/Utils/Local.cpp | 4 ++++
llvm/test/Transforms/Reassociate/or-disjoint.ll | 4 ++--
4 files changed, 7 insertions(+), 9 deletions(-)
diff --git a/llvm/include/llvm/Transforms/Utils/Local.h b/llvm/include/llvm/Transforms/Utils/Local.h
index fa26446f9492a..9214aad4e6aec 100644
--- a/llvm/include/llvm/Transforms/Utils/Local.h
+++ b/llvm/include/llvm/Transforms/Utils/Local.h
@@ -563,6 +563,7 @@ bool inferAttributesFromOthers(Function &F);
struct OverflowTracking {
bool HasNUW = true;
bool HasNSW = true;
+ bool IsDisjoint = true;
// Note: At the moment, users are responsible to manage AllKnownNonNegative
// and AllKnownNonZero manually. AllKnownNonNegative can be true in a case
diff --git a/llvm/lib/Transforms/Scalar/LICM.cpp b/llvm/lib/Transforms/Scalar/LICM.cpp
index 7c7e0dcff0886..006a09b38bc71 100644
--- a/llvm/lib/Transforms/Scalar/LICM.cpp
+++ b/llvm/lib/Transforms/Scalar/LICM.cpp
@@ -2870,13 +2870,6 @@ static bool hoistBOAssociation(Instruction &I, Loop &L,
if (auto *I = dyn_cast<Instruction>(Inv))
I->setFastMathFlags(Intersect);
NewBO->setFastMathFlags(Intersect);
- } else if (Opcode == Instruction::Or) {
- bool Disjoint = cast<PossiblyDisjointInst>(BO)->isDisjoint() &&
- cast<PossiblyDisjointInst>(BO0)->isDisjoint();
- // If `Inv` was not constant-folded, a new Instruction has been created.
- if (auto *I = dyn_cast<PossiblyDisjointInst>(Inv))
- I->setIsDisjoint(Disjoint);
- cast<PossiblyDisjointInst>(NewBO)->setIsDisjoint(Disjoint);
} else {
OverflowTracking Flags;
Flags.AllKnownNonNegative = false;
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp
index 4d168ce7cf591..69dcd30d1af99 100644
--- a/llvm/lib/Transforms/Utils/Local.cpp
+++ b/llvm/lib/Transforms/Utils/Local.cpp
@@ -4368,6 +4368,8 @@ void OverflowTracking::mergeFlags(Instruction &I) {
HasNUW &= I.hasNoUnsignedWrap();
HasNSW &= I.hasNoSignedWrap();
}
+ if (auto *DisjointOp = dyn_cast<PossiblyDisjointInst>(&I))
+ IsDisjoint &= DisjointOp->isDisjoint();
}
void OverflowTracking::applyFlags(Instruction &I) {
@@ -4379,4 +4381,6 @@ void OverflowTracking::applyFlags(Instruction &I) {
if (HasNSW && (AllKnownNonNegative || HasNUW))
I.setHasNoSignedWrap();
}
+ if (auto *DisjointOp = dyn_cast<PossiblyDisjointInst>(&I))
+ DisjointOp->setIsDisjoint(IsDisjoint);
}
diff --git a/llvm/test/Transforms/Reassociate/or-disjoint.ll b/llvm/test/Transforms/Reassociate/or-disjoint.ll
index 777836ed98152..b060b94e01d69 100644
--- a/llvm/test/Transforms/Reassociate/or-disjoint.ll
+++ b/llvm/test/Transforms/Reassociate/or-disjoint.ll
@@ -4,8 +4,8 @@
define i16 @or_disjoint_both(i16 %a, i16 %b) {
; CHECK-LABEL: @or_disjoint_both(
-; CHECK-NEXT: [[OR_1:%.*]] = or i16 [[A:%.*]], 1
-; CHECK-NEXT: [[OR_2:%.*]] = or i16 [[OR_1]], [[B:%.*]]
+; CHECK-NEXT: [[OR_1:%.*]] = or disjoint i16 [[A:%.*]], 1
+; CHECK-NEXT: [[OR_2:%.*]] = or disjoint i16 [[OR_1]], [[B:%.*]]
; CHECK-NEXT: ret i16 [[OR_2]]
;
%or.1 = or disjoint i16 %b, %a
More information about the llvm-commits
mailing list