Skip to content

Commit 12e5451

Browse files
author
git apple-llvm automerger
committed
Merge commit 'f8122518750e' from llvm.org/main into next
2 parents c2b4871 + f812251 commit 12e5451

File tree

2 files changed

+9
-27
lines changed

2 files changed

+9
-27
lines changed

llvm/lib/Transforms/Scalar/ConstraintElimination.cpp

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -968,23 +968,10 @@ void State::addInfoForInductions(BasicBlock &BB) {
968968
return;
969969

970970
if (!StepOffset.isOne()) {
971-
auto *UpperGEP = dyn_cast<GetElementPtrInst>(B);
972-
if (!UpperGEP || UpperGEP->getPointerOperand() != StartValue ||
973-
!UpperGEP->isInBounds())
974-
return;
975-
976-
MapVector<Value *, APInt> UpperVariableOffsets;
977-
APInt UpperConstantOffset(StepOffset.getBitWidth(), 0);
978-
const DataLayout &DL = BB.getModule()->getDataLayout();
979-
if (!UpperGEP->collectOffset(DL, StepOffset.getBitWidth(),
980-
UpperVariableOffsets, UpperConstantOffset))
981-
return;
982-
// All variable offsets and the constant offset have to be a multiple of the
983-
// step.
984-
if (!UpperConstantOffset.urem(StepOffset).isZero() ||
985-
any_of(UpperVariableOffsets, [&StepOffset](const auto &P) {
986-
return !P.second.urem(StepOffset).isZero();
987-
}))
971+
// Check whether B-Start is known to be a multiple of StepOffset.
972+
const SCEV *BMinusStart = SE.getMinusSCEV(SE.getSCEV(B), StartSCEV);
973+
if (isa<SCEVCouldNotCompute>(BMinusStart) ||
974+
!SE.getConstantMultiple(BMinusStart).urem(StepOffset).isZero())
988975
return;
989976
}
990977

llvm/test/Transforms/ConstraintElimination/monotonic-int-phis-multiples.ll

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ define void @multiple_pow2(i64 %count) {
1313
; CHECK-NEXT: [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
1414
; CHECK-NEXT: br i1 [[CMP_I_NOT]], label [[EXIT:%.*]], label [[LOOP_LATCH]]
1515
; CHECK: loop.latch:
16-
; CHECK-NEXT: [[CMP2_I_I:%.*]] = icmp ult i64 [[IV]], [[END]]
17-
; CHECK-NEXT: br i1 [[CMP2_I_I]], label [[LOOP]], label [[EXIT]]
16+
; CHECK-NEXT: br i1 true, label [[LOOP]], label [[EXIT]]
1817
; CHECK: exit:
1918
; CHECK-NEXT: ret void
2019
;
@@ -48,8 +47,7 @@ define void @multiple_pow2_larger_than_needed(i64 %count) {
4847
; CHECK-NEXT: [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
4948
; CHECK-NEXT: br i1 [[CMP_I_NOT]], label [[EXIT:%.*]], label [[LOOP_LATCH]]
5049
; CHECK: loop.latch:
51-
; CHECK-NEXT: [[CMP2_I_I:%.*]] = icmp ult i64 [[IV]], [[END]]
52-
; CHECK-NEXT: br i1 [[CMP2_I_I]], label [[LOOP]], label [[EXIT]]
50+
; CHECK-NEXT: br i1 true, label [[LOOP]], label [[EXIT]]
5351
; CHECK: exit:
5452
; CHECK-NEXT: ret void
5553
;
@@ -119,8 +117,7 @@ define void @multiple_pow2_start_offset(i64 %count) {
119117
; CHECK-NEXT: [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
120118
; CHECK-NEXT: br i1 [[CMP_I_NOT]], label [[EXIT]], label [[LOOP_LATCH]]
121119
; CHECK: loop.latch:
122-
; CHECK-NEXT: [[CMP2_I_I:%.*]] = icmp ult i64 [[IV]], [[END]]
123-
; CHECK-NEXT: br i1 [[CMP2_I_I]], label [[LOOP]], label [[EXIT]]
120+
; CHECK-NEXT: br i1 true, label [[LOOP]], label [[EXIT]]
124121
; CHECK: exit:
125122
; CHECK-NEXT: ret void
126123
;
@@ -194,8 +191,7 @@ define void @multiple_pow2_start_offset_dynamic(i64 %count) {
194191
; CHECK-NEXT: [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
195192
; CHECK-NEXT: br i1 [[CMP_I_NOT]], label [[EXIT]], label [[LOOP_LATCH]]
196193
; CHECK: loop.latch:
197-
; CHECK-NEXT: [[CMP2_I_I:%.*]] = icmp ult i64 [[IV]], [[END]]
198-
; CHECK-NEXT: br i1 [[CMP2_I_I]], label [[LOOP]], label [[EXIT]]
194+
; CHECK-NEXT: br i1 true, label [[LOOP]], label [[EXIT]]
199195
; CHECK: exit:
200196
; CHECK-NEXT: ret void
201197
;
@@ -231,8 +227,7 @@ define void @multiple_non_pow2_nuw(i64 %count) {
231227
; CHECK-NEXT: [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
232228
; CHECK-NEXT: br i1 [[CMP_I_NOT]], label [[EXIT:%.*]], label [[LOOP_LATCH]]
233229
; CHECK: loop.latch:
234-
; CHECK-NEXT: [[CMP2_I_I:%.*]] = icmp ult i64 [[IV]], [[END]]
235-
; CHECK-NEXT: br i1 [[CMP2_I_I]], label [[LOOP]], label [[EXIT]]
230+
; CHECK-NEXT: br i1 true, label [[LOOP]], label [[EXIT]]
236231
; CHECK: exit:
237232
; CHECK-NEXT: ret void
238233
;

0 commit comments

Comments
 (0)