diff options
author | Florian Hahn <flo@fhahn.com> | 2025-05-23 14:59:18 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-23 14:59:18 +0100 |
commit | 34813d9d384fc97e4c20e4dc4a8d2099392d46a6 (patch) | |
tree | 54b13212fdc39c87850b241607544acab04e9c11 | |
parent | 50304b0806e4f9c8001c024925566c9b88e7176e (diff) | |
download | llvm-34813d9d384fc97e4c20e4dc4a8d2099392d46a6.zip llvm-34813d9d384fc97e4c20e4dc4a8d2099392d46a6.tar.gz llvm-34813d9d384fc97e4c20e4dc4a8d2099392d46a6.tar.bz2 |
[Reassociate] Move Disjoint flag handling to OverflowTracking. (#140406)
Move disjoint flag tracking to OverflowTracking. This enables preserving
disjoint flags in Reassociate.
Depends on https://github.com/llvm/llvm-project/pull/140404
PR: https://github.com/llvm/llvm-project/pull/140406
-rw-r--r-- | llvm/include/llvm/Transforms/Utils/Local.h | 1 | ||||
-rw-r--r-- | llvm/lib/Transforms/Scalar/LICM.cpp | 7 | ||||
-rw-r--r-- | llvm/lib/Transforms/Utils/Local.cpp | 4 | ||||
-rw-r--r-- | 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 fa26446..9214aad 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 7c7e0dc..006a09b 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 4d168ce..69dcd30 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 777836e..b060b94 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 |