Skip to content

Commit cb90560

Browse files
authored
Revert "[SCEVExp] Use SCEVPtrToAddr in tryToReuseLCSSAPhi if possible." (llvm#180257)
Reverts llvm#178727 triggers asserts in on some build bots
1 parent 5f4543f commit cb90560

File tree

4 files changed

+20
-39
lines changed

4 files changed

+20
-39
lines changed

llvm/include/llvm/Analysis/ScalarEvolutionPatternMatch.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -186,12 +186,6 @@ m_scev_PtrToInt(const Op0_t &Op0) {
186186
return SCEVUnaryExpr_match<SCEVPtrToIntExpr, Op0_t>(Op0);
187187
}
188188

189-
template <typename Op0_t>
190-
inline SCEVUnaryExpr_match<SCEVPtrToAddrExpr, Op0_t>
191-
m_scev_PtrToAddr(const Op0_t &Op0) {
192-
return SCEVUnaryExpr_match<SCEVPtrToAddrExpr, Op0_t>(Op0);
193-
}
194-
195189
template <typename Op0_t>
196190
inline SCEVUnaryExpr_match<SCEVTruncateExpr, Op0_t>
197191
m_scev_Trunc(const Op0_t &Op0) {

llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp

Lines changed: 15 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,42 +1254,29 @@ Value *SCEVExpander::tryToReuseLCSSAPhi(const SCEVAddRecExpr *S) {
12541254
!SE.DT.dominates(EB, Builder.GetInsertBlock()))
12551255
return nullptr;
12561256

1257-
// Helper to check if the diff between S and ExitSCEV is simple enough to
1258-
// allow reusing the LCSSA phi.
1259-
auto CanReuse = [&](const SCEV *ExitSCEV) -> const SCEV * {
1260-
if (isa<SCEVCouldNotCompute>(ExitSCEV))
1261-
return nullptr;
1262-
const SCEV *Diff = SE.getMinusSCEV(S, ExitSCEV);
1263-
const SCEV *Op = Diff;
1264-
match(Op, m_scev_Add(m_SCEVConstant(), m_SCEV(Op)));
1265-
match(Op, m_scev_Mul(m_scev_AllOnes(), m_SCEV(Op)));
1266-
match(Op, m_scev_PtrToAddr(m_SCEV(Op))) ||
1267-
match(Op, m_scev_PtrToInt(m_SCEV(Op)));
1268-
if (!isa<SCEVConstant, SCEVUnknown>(Op))
1269-
return nullptr;
1270-
return Diff;
1271-
};
1272-
12731257
for (auto &PN : EB->phis()) {
12741258
if (!SE.isSCEVable(PN.getType()))
12751259
continue;
12761260
auto *ExitSCEV = SE.getSCEV(&PN);
12771261
if (!isa<SCEVAddRecExpr>(ExitSCEV))
12781262
continue;
12791263
Type *PhiTy = PN.getType();
1280-
const SCEV *Diff = nullptr;
12811264
if (STy->isIntegerTy() && PhiTy->isPointerTy()) {
1282-
// Prefer ptrtoaddr over ptrtoint.
1283-
const SCEV *AddrSCEV = SE.getPtrToAddrExpr(ExitSCEV);
1284-
Diff = CanReuse(AddrSCEV);
1285-
if (!Diff) {
1286-
const SCEV *IntSCEV = SE.getPtrToIntExpr(ExitSCEV, STy);
1287-
Diff = CanReuse(IntSCEV);
1288-
}
1289-
} else if (STy == PhiTy) {
1290-
Diff = CanReuse(ExitSCEV);
1265+
ExitSCEV = SE.getPtrToIntExpr(ExitSCEV, STy);
1266+
if (isa<SCEVCouldNotCompute>(ExitSCEV))
1267+
continue;
1268+
} else if (S->getType() != PN.getType()) {
1269+
continue;
12911270
}
1292-
if (!Diff)
1271+
1272+
// Check if we can re-use the existing PN, by adjusting it with an expanded
1273+
// offset, if the offset is simpler.
1274+
const SCEV *Diff = SE.getMinusSCEV(S, ExitSCEV);
1275+
const SCEV *Op = Diff;
1276+
match(Op, m_scev_Add(m_SCEVConstant(), m_SCEV(Op)));
1277+
match(Op, m_scev_Mul(m_scev_AllOnes(), m_SCEV(Op)));
1278+
match(Op, m_scev_PtrToInt(m_SCEV(Op)));
1279+
if (!isa<SCEVConstant, SCEVUnknown>(Op))
12931280
continue;
12941281

12951282
assert(Diff->getType()->isIntegerTy() &&
@@ -1299,7 +1286,7 @@ Value *SCEVExpander::tryToReuseLCSSAPhi(const SCEVAddRecExpr *S) {
12991286
if (PhiTy->isPointerTy()) {
13001287
if (STy->isPointerTy())
13011288
return Builder.CreatePtrAdd(BaseV, DiffV);
1302-
BaseV = Builder.CreatePtrToAddr(BaseV);
1289+
BaseV = Builder.CreatePtrToInt(BaseV, DiffV->getType());
13031290
}
13041291
return Builder.CreateAdd(BaseV, DiffV);
13051292
}

llvm/test/Transforms/LoopIdiom/reuse-lcssa-phi-scev-expansion.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ define void @scev_expand_ptrtoint(i8 %x, ptr %start) {
1010
; CHECK-LABEL: define void @scev_expand_ptrtoint(
1111
; CHECK-SAME: i8 [[X:%.*]], ptr [[START:%.*]]) {
1212
; CHECK-NEXT: [[ENTRY:.*]]:
13-
; CHECK-NEXT: [[START1:%.*]] = ptrtoaddr ptr [[START]] to i64
13+
; CHECK-NEXT: [[START1:%.*]] = ptrtoint ptr [[START]] to i64
1414
; CHECK-NEXT: br label %[[LOOP_1_HEADER:.*]]
1515
; CHECK: [[LOOP_1_HEADER]]:
1616
; 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) {
3636
; CHECK-NEXT: [[INDVAR_LCSSA:%.*]] = phi i64 [ [[INDVAR]], %[[LOOP_2_HEADER]] ], [ [[INDVAR]], %[[LOOP_2_HEADER]] ]
3737
; CHECK-NEXT: [[PTR_IV_2_LCSSA:%.*]] = phi ptr [ [[PTR_IV_2]], %[[LOOP_2_HEADER]] ], [ [[PTR_IV_2]], %[[LOOP_2_HEADER]] ]
3838
; CHECK-NEXT: [[TMP0:%.*]] = sub i64 1, [[START1]]
39-
; CHECK-NEXT: [[TMP1:%.*]] = ptrtoaddr ptr [[PTR_IV_1_LCSSA]] to i64
39+
; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[PTR_IV_1_LCSSA]] to i64
4040
; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], [[TMP0]]
4141
; CHECK-NEXT: [[TMP4:%.*]] = add i64 [[CMP_EXT]], [[TMP2]]
4242
; CHECK-NEXT: [[TMP5:%.*]] = add i64 [[INDVAR_LCSSA]], [[TMP4]]

llvm/test/Transforms/LoopVectorize/reuse-lcssa-phi-scev-expansion.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ define void @runtime_checks_ptr_inductions(ptr %dst.1, ptr %dst.2, i1 %c) {
118118
; CHECK-NEXT: [[SEL_DST_LCSSA:%.*]] = phi ptr [ [[SEL_DST]], %[[LOOP_1]] ]
119119
; CHECK-NEXT: br label %[[VECTOR_MEMCHECK:.*]]
120120
; CHECK: [[VECTOR_MEMCHECK]]:
121-
; CHECK-NEXT: [[TMP0:%.*]] = ptrtoaddr ptr [[PTR_IV_1_LCSSA]] to i64
121+
; CHECK-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[PTR_IV_1_LCSSA]] to i64
122122
; CHECK-NEXT: [[TMP1:%.*]] = sub i64 [[TMP0]], [[SEL_DST_LCSSA12]]
123123
; CHECK-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP1]], 2
124124
; 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) {
308308
; CHECK-NEXT: br label %[[VECTOR_MEMCHECK:.*]]
309309
; CHECK: [[VECTOR_MEMCHECK]]:
310310
; CHECK-NEXT: [[TMP0:%.*]] = sub i64 0, [[SRC2]]
311-
; CHECK-NEXT: [[TMP5:%.*]] = ptrtoaddr ptr [[TMP1]] to i64
311+
; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[TMP1]] to i64
312312
; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP5]], [[TMP0]]
313313
; CHECK-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP2]], 16
314314
; 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) {
403403
; CHECK-NEXT: br label %[[VECTOR_MEMCHECK:.*]]
404404
; CHECK: [[VECTOR_MEMCHECK]]:
405405
; CHECK-NEXT: [[TMP0:%.*]] = sub i64 -2, [[SRC2]]
406-
; CHECK-NEXT: [[TMP1:%.*]] = ptrtoaddr ptr [[PTR_IV_1_NEXT_LCSSA]] to i64
406+
; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[PTR_IV_1_NEXT_LCSSA]] to i64
407407
; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], [[TMP0]]
408408
; CHECK-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP2]], 4
409409
; CHECK-NEXT: br i1 [[DIFF_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]

0 commit comments

Comments
 (0)