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(Inv)) I->setFastMathFlags(Intersect); NewBO->setFastMathFlags(Intersect); - } else if (Opcode == Instruction::Or) { - bool Disjoint = cast(BO)->isDisjoint() && - cast(BO0)->isDisjoint(); - // If `Inv` was not constant-folded, a new Instruction has been created. - if (auto *I = dyn_cast(Inv)) - I->setIsDisjoint(Disjoint); - cast(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(&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(&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