Author: Florian Hahn Date: 2026-02-06T18:26:00Z New Revision: 82dfbdb3cbcb0f9f91c1ec1a720feb317867d2c1
URL: https://github.com/llvm/llvm-project/commit/82dfbdb3cbcb0f9f91c1ec1a720feb317867d2c1 DIFF: https://github.com/llvm/llvm-project/commit/82dfbdb3cbcb0f9f91c1ec1a720feb317867d2c1.diff LOG: Revert "[SCEVExp] Use SCEVPtrToAddr in tryToReuseLCSSAPhi if possible. (#178727)" This reverts commit c32cde4182f02df7a67455ff0567ddcc1cf9bfb7. Added: Modified: llvm/include/llvm/Analysis/ScalarEvolutionPatternMatch.h llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp llvm/test/Transforms/LoopIdiom/reuse-lcssa-phi-scev-expansion.ll llvm/test/Transforms/LoopVectorize/reuse-lcssa-phi-scev-expansion.ll Removed: ################################################################################ diff --git a/llvm/include/llvm/Analysis/ScalarEvolutionPatternMatch.h b/llvm/include/llvm/Analysis/ScalarEvolutionPatternMatch.h index 7b00d0109a68c..f285eacc4c565 100644 --- a/llvm/include/llvm/Analysis/ScalarEvolutionPatternMatch.h +++ b/llvm/include/llvm/Analysis/ScalarEvolutionPatternMatch.h @@ -186,12 +186,6 @@ m_scev_PtrToInt(const Op0_t &Op0) { return SCEVUnaryExpr_match<SCEVPtrToIntExpr, Op0_t>(Op0); } -template <typename Op0_t> -inline SCEVUnaryExpr_match<SCEVPtrToAddrExpr, Op0_t> -m_scev_PtrToAddr(const Op0_t &Op0) { - return SCEVUnaryExpr_match<SCEVPtrToAddrExpr, Op0_t>(Op0); -} - template <typename Op0_t> inline SCEVUnaryExpr_match<SCEVTruncateExpr, Op0_t> m_scev_Trunc(const Op0_t &Op0) { diff --git a/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp b/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp index 0cd809944227b..cccb944618e07 100644 --- a/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp +++ b/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp @@ -1254,22 +1254,6 @@ Value *SCEVExpander::tryToReuseLCSSAPhi(const SCEVAddRecExpr *S) { !SE.DT.dominates(EB, Builder.GetInsertBlock())) return nullptr; - // Helper to check if the diff between S and ExitSCEV is simple enough to - // allow reusing the LCSSA phi. - auto CanReuse = [&](const SCEV *ExitSCEV) -> const SCEV * { - if (isa<SCEVCouldNotCompute>(ExitSCEV)) - return nullptr; - const SCEV *Diff = SE.getMinusSCEV(S, ExitSCEV); - const SCEV *Op = Diff; - match(Op, m_scev_Add(m_SCEVConstant(), m_SCEV(Op))); - match(Op, m_scev_Mul(m_scev_AllOnes(), m_SCEV(Op))); - match(Op, m_scev_PtrToAddr(m_SCEV(Op))) || - match(Op, m_scev_PtrToInt(m_SCEV(Op))); - if (!isa<SCEVConstant, SCEVUnknown>(Op)) - return nullptr; - return Diff; - }; - for (auto &PN : EB->phis()) { if (!SE.isSCEVable(PN.getType())) continue; @@ -1277,19 +1261,22 @@ Value *SCEVExpander::tryToReuseLCSSAPhi(const SCEVAddRecExpr *S) { if (!isa<SCEVAddRecExpr>(ExitSCEV)) continue; Type *PhiTy = PN.getType(); - const SCEV *Diff = nullptr; if (STy->isIntegerTy() && PhiTy->isPointerTy()) { - // Prefer ptrtoaddr over ptrtoint. - const SCEV *AddrSCEV = SE.getPtrToAddrExpr(ExitSCEV); - Diff = CanReuse(AddrSCEV); - if (!Diff) { - const SCEV *IntSCEV = SE.getPtrToIntExpr(ExitSCEV, STy); - Diff = CanReuse(IntSCEV); - } - } else if (STy == PhiTy) { - Diff = CanReuse(ExitSCEV); + ExitSCEV = SE.getPtrToIntExpr(ExitSCEV, STy); + if (isa<SCEVCouldNotCompute>(ExitSCEV)) + continue; + } else if (S->getType() != PN.getType()) { + continue; } - if (!Diff) + + // Check if we can re-use the existing PN, by adjusting it with an expanded + // offset, if the offset is simpler. + const SCEV *Diff = SE.getMinusSCEV(S, ExitSCEV); + const SCEV *Op = Diff; + match(Op, m_scev_Add(m_SCEVConstant(), m_SCEV(Op))); + match(Op, m_scev_Mul(m_scev_AllOnes(), m_SCEV(Op))); + match(Op, m_scev_PtrToInt(m_SCEV(Op))); + if (!isa<SCEVConstant, SCEVUnknown>(Op)) continue; assert(Diff->getType()->isIntegerTy() && @@ -1299,7 +1286,7 @@ Value *SCEVExpander::tryToReuseLCSSAPhi(const SCEVAddRecExpr *S) { if (PhiTy->isPointerTy()) { if (STy->isPointerTy()) return Builder.CreatePtrAdd(BaseV, DiffV); - BaseV = Builder.CreatePtrToAddr(BaseV); + BaseV = Builder.CreatePtrToInt(BaseV, DiffV->getType()); } return Builder.CreateAdd(BaseV, DiffV); } diff --git a/llvm/test/Transforms/LoopIdiom/reuse-lcssa-phi-scev-expansion.ll b/llvm/test/Transforms/LoopIdiom/reuse-lcssa-phi-scev-expansion.ll index 06980dcddd705..a15db620e0082 100644 --- a/llvm/test/Transforms/LoopIdiom/reuse-lcssa-phi-scev-expansion.ll +++ b/llvm/test/Transforms/LoopIdiom/reuse-lcssa-phi-scev-expansion.ll @@ -10,7 +10,7 @@ define void @scev_expand_ptrtoint(i8 %x, ptr %start) { ; CHECK-LABEL: define void @scev_expand_ptrtoint( ; CHECK-SAME: i8 [[X:%.*]], ptr [[START:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*]]: -; CHECK-NEXT: [[START1:%.*]] = ptrtoaddr ptr [[START]] to i64 +; CHECK-NEXT: [[START1:%.*]] = ptrtoint ptr [[START]] to i64 ; CHECK-NEXT: br label %[[LOOP_1_HEADER:.*]] ; CHECK: [[LOOP_1_HEADER]]: ; CHECK-NEXT: [[PTR_IV_1:%.*]] = phi ptr [ [[START]], %[[ENTRY]] ], [ [[PTR_IV_1_NEXT:%.*]], %[[LOOP_1_LATCH:.*]] ] @@ -36,7 +36,7 @@ define void @scev_expand_ptrtoint(i8 %x, ptr %start) { ; CHECK-NEXT: [[INDVAR_LCSSA:%.*]] = phi i64 [ [[INDVAR]], %[[LOOP_2_HEADER]] ], [ [[INDVAR]], %[[LOOP_2_HEADER]] ] ; CHECK-NEXT: [[PTR_IV_2_LCSSA:%.*]] = phi ptr [ [[PTR_IV_2]], %[[LOOP_2_HEADER]] ], [ [[PTR_IV_2]], %[[LOOP_2_HEADER]] ] ; CHECK-NEXT: [[TMP0:%.*]] = sub i64 1, [[START1]] -; CHECK-NEXT: [[TMP1:%.*]] = ptrtoaddr ptr [[PTR_IV_1_LCSSA]] to i64 +; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[PTR_IV_1_LCSSA]] to i64 ; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], [[TMP0]] ; CHECK-NEXT: [[TMP4:%.*]] = add i64 [[CMP_EXT]], [[TMP2]] ; CHECK-NEXT: [[TMP5:%.*]] = add i64 [[INDVAR_LCSSA]], [[TMP4]] diff --git a/llvm/test/Transforms/LoopVectorize/reuse-lcssa-phi-scev-expansion.ll b/llvm/test/Transforms/LoopVectorize/reuse-lcssa-phi-scev-expansion.ll index 0b1c3165fe13a..557c7e570766c 100644 --- a/llvm/test/Transforms/LoopVectorize/reuse-lcssa-phi-scev-expansion.ll +++ b/llvm/test/Transforms/LoopVectorize/reuse-lcssa-phi-scev-expansion.ll @@ -118,7 +118,7 @@ define void @runtime_checks_ptr_inductions(ptr %dst.1, ptr %dst.2, i1 %c) { ; CHECK-NEXT: [[SEL_DST_LCSSA:%.*]] = phi ptr [ [[SEL_DST]], %[[LOOP_1]] ] ; CHECK-NEXT: br label %[[VECTOR_MEMCHECK:.*]] ; CHECK: [[VECTOR_MEMCHECK]]: -; CHECK-NEXT: [[TMP0:%.*]] = ptrtoaddr ptr [[PTR_IV_1_LCSSA]] to i64 +; CHECK-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[PTR_IV_1_LCSSA]] to i64 ; CHECK-NEXT: [[TMP1:%.*]] = sub i64 [[TMP0]], [[SEL_DST_LCSSA12]] ; CHECK-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP1]], 2 ; CHECK-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]] @@ -308,7 +308,7 @@ define void @expand_ diff _neg_ptrtoint_expr(ptr %src, ptr %start) { ; CHECK-NEXT: br label %[[VECTOR_MEMCHECK:.*]] ; CHECK: [[VECTOR_MEMCHECK]]: ; CHECK-NEXT: [[TMP0:%.*]] = sub i64 0, [[SRC2]] -; CHECK-NEXT: [[TMP5:%.*]] = ptrtoaddr ptr [[TMP1]] to i64 +; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[TMP1]] to i64 ; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP5]], [[TMP0]] ; CHECK-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP2]], 16 ; CHECK-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]] @@ -403,7 +403,7 @@ define void @scev_exp_reuse_const_add(ptr %dst, ptr %src) { ; CHECK-NEXT: br label %[[VECTOR_MEMCHECK:.*]] ; CHECK: [[VECTOR_MEMCHECK]]: ; CHECK-NEXT: [[TMP0:%.*]] = sub i64 -2, [[SRC2]] -; CHECK-NEXT: [[TMP1:%.*]] = ptrtoaddr ptr [[PTR_IV_1_NEXT_LCSSA]] to i64 +; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[PTR_IV_1_NEXT_LCSSA]] to i64 ; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], [[TMP0]] ; CHECK-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP2]], 4 ; CHECK-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]] _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
