Skip to content

Commit d1e9466

Browse files
committed
Address review comments
1 parent c56c43d commit d1e9466

File tree

2 files changed

+10
-246
lines changed

2 files changed

+10
-246
lines changed

llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4590,15 +4590,12 @@ static bool shouldUnrollLoopWithInstruction(Instruction &I,
45904590
// 2. Has a valid cost,
45914591
// 3. Has a cost within the supplied budget.
45924592
// Otherwise it returns false.
4593-
static bool isLoopSizeWithinBudget(Loop *L, AArch64TTIImpl &TTI,
4594-
InstructionCost Budget,
4595-
unsigned *FinalSize) {
4593+
static bool canUnrollLoopWithinBudget(Loop *L, AArch64TTIImpl &TTI,
4594+
InstructionCost Budget,
4595+
unsigned *FinalSize) {
45964596
// Estimate the size of the loop.
45974597
InstructionCost LoopCost = 0;
45984598

4599-
if (findStringMetadataForLoop(L, "llvm.loop.isvectorized"))
4600-
return false;
4601-
46024599
for (auto *BB : L->getBlocks()) {
46034600
for (auto &I : *BB) {
46044601
if (!shouldUnrollLoopWithInstruction(I, TTI))
@@ -4638,8 +4635,11 @@ static bool shouldUnrollMultiExitLoop(Loop *L, ScalarEvolution &SE,
46384635
if (MaxTC > 0 && MaxTC <= 32)
46394636
return false;
46404637

4638+
if (findStringMetadataForLoop(L, "llvm.loop.isvectorized"))
4639+
return false;
4640+
46414641
// Estimate the size of the loop.
4642-
if (!isLoopSizeWithinBudget(L, TTI, 5, nullptr))
4642+
if (!canUnrollLoopWithinBudget(L, TTI, 5, nullptr))
46434643
return false;
46444644

46454645
// Small search loops with multiple exits can be highly beneficial to unroll.
@@ -4696,7 +4696,7 @@ getAppleRuntimeUnrollPreferences(Loop *L, ScalarEvolution &SE,
46964696
if (Header == L->getLoopLatch()) {
46974697
// Estimate the size of the loop.
46984698
unsigned Size;
4699-
if (!isLoopSizeWithinBudget(L, TTI, 8, &Size))
4699+
if (!canUnrollLoopWithinBudget(L, TTI, 8, &Size))
47004700
return;
47014701

47024702
SmallPtrSet<Value *, 8> LoadedValues;
@@ -4809,6 +4809,8 @@ void AArch64TTIImpl::getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
48094809
break;
48104810
}
48114811

4812+
// If this is a small, multi-exit loop similar to something like std::find,
4813+
// then there is typically a performance improvement achieved by unrolling.
48124814
if (!L->getExitBlock() && shouldUnrollMultiExitLoop(L, SE, *this)) {
48134815
UP.RuntimeUnrollMultiExit = true;
48144816
UP.Runtime = true;

llvm/test/Transforms/LoopUnroll/AArch64/apple-unrolling-multi-exit.ll

Lines changed: 0 additions & 238 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
; RUN: opt -p loop-unroll -mcpu=apple-m3 -S %s | FileCheck --check-prefix=APPLE %s
55
; RUN: opt -p loop-unroll -mcpu=apple-m4 -S %s | FileCheck --check-prefix=APPLE %s
66
; RUN: opt -p loop-unroll -mcpu=apple-m1 -unroll-runtime-multi-exit=false -S %s | FileCheck --check-prefix=NOUNROLL %s
7-
; RUN: opt -p loop-unroll -mcpu=cortex-a57 -S %s | FileCheck --check-prefix=OTHER %s
87

98
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"
109
target triple = "arm64-apple-macosx15.0.0"
@@ -108,83 +107,6 @@ define i1 @multi_2_exit_find_i8_loop(ptr %vec, i8 %tgt) {
108107
; NOUNROLL-NEXT: [[C_3:%.*]] = icmp eq ptr [[RES]], [[END]]
109108
; NOUNROLL-NEXT: ret i1 [[C_3]]
110109
;
111-
; OTHER-LABEL: define i1 @multi_2_exit_find_i8_loop(
112-
; OTHER-SAME: ptr [[VEC:%.*]], i8 [[TGT:%.*]]) #[[ATTR0:[0-9]+]] {
113-
; OTHER-NEXT: [[ENTRY:.*]]:
114-
; OTHER-NEXT: [[START:%.*]] = load ptr, ptr [[VEC]], align 8
115-
; OTHER-NEXT: [[START2:%.*]] = ptrtoint ptr [[START]] to i64
116-
; OTHER-NEXT: [[GEP_END:%.*]] = getelementptr inbounds nuw i8, ptr [[VEC]], i64 1
117-
; OTHER-NEXT: [[END:%.*]] = load ptr, ptr [[GEP_END]], align 8
118-
; OTHER-NEXT: [[END1:%.*]] = ptrtoint ptr [[END]] to i64
119-
; OTHER-NEXT: [[TMP0:%.*]] = sub i64 [[END1]], [[START2]]
120-
; OTHER-NEXT: [[TMP1:%.*]] = freeze i64 [[TMP0]]
121-
; OTHER-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], -1
122-
; OTHER-NEXT: [[XTRAITER:%.*]] = and i64 [[TMP1]], 3
123-
; OTHER-NEXT: [[LCMP_MOD:%.*]] = icmp ne i64 [[XTRAITER]], 0
124-
; OTHER-NEXT: br i1 [[LCMP_MOD]], label %[[LOOP_HEADER_PROL_PREHEADER:.*]], label %[[LOOP_HEADER_PROL_LOOPEXIT:.*]]
125-
; OTHER: [[LOOP_HEADER_PROL_PREHEADER]]:
126-
; OTHER-NEXT: br label %[[LOOP_HEADER_PROL:.*]]
127-
; OTHER: [[LOOP_HEADER_PROL]]:
128-
; OTHER-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], %[[LOOP_LATCH_PROL:.*]] ], [ [[START]], %[[LOOP_HEADER_PROL_PREHEADER]] ]
129-
; OTHER-NEXT: [[PROL_ITER:%.*]] = phi i64 [ 0, %[[LOOP_HEADER_PROL_PREHEADER]] ], [ [[PROL_ITER_NEXT:%.*]], %[[LOOP_LATCH_PROL]] ]
130-
; OTHER-NEXT: [[L:%.*]] = load i8, ptr [[PTR_IV]], align 8
131-
; OTHER-NEXT: [[C_1:%.*]] = icmp eq i8 [[L]], [[TGT]]
132-
; OTHER-NEXT: br i1 [[C_1]], label %[[EXIT_UNR_LCSSA_LOOPEXIT3:.*]], label %[[LOOP_LATCH_PROL]]
133-
; OTHER: [[LOOP_LATCH_PROL]]:
134-
; OTHER-NEXT: [[PTR_IV_NEXT]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 1
135-
; OTHER-NEXT: [[C_2:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END]]
136-
; OTHER-NEXT: [[PROL_ITER_NEXT]] = add i64 [[PROL_ITER]], 1
137-
; OTHER-NEXT: [[PROL_ITER_CMP:%.*]] = icmp ne i64 [[PROL_ITER_NEXT]], [[XTRAITER]]
138-
; OTHER-NEXT: br i1 [[PROL_ITER_CMP]], label %[[LOOP_HEADER_PROL]], label %[[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA:.*]], !llvm.loop [[LOOP0:![0-9]+]]
139-
; OTHER: [[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA]]:
140-
; OTHER-NEXT: [[RES_UNR_PH:%.*]] = phi ptr [ [[END]], %[[LOOP_LATCH_PROL]] ]
141-
; OTHER-NEXT: [[PTR_IV_UNR_PH:%.*]] = phi ptr [ [[PTR_IV_NEXT]], %[[LOOP_LATCH_PROL]] ]
142-
; OTHER-NEXT: br label %[[LOOP_HEADER_PROL_LOOPEXIT]]
143-
; OTHER: [[LOOP_HEADER_PROL_LOOPEXIT]]:
144-
; OTHER-NEXT: [[RES_UNR:%.*]] = phi ptr [ poison, %[[ENTRY]] ], [ [[RES_UNR_PH]], %[[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA]] ]
145-
; OTHER-NEXT: [[PTR_IV_UNR:%.*]] = phi ptr [ [[START]], %[[ENTRY]] ], [ [[PTR_IV_UNR_PH]], %[[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA]] ]
146-
; OTHER-NEXT: [[TMP3:%.*]] = icmp ult i64 [[TMP2]], 3
147-
; OTHER-NEXT: br i1 [[TMP3]], label %[[EXIT:.*]], label %[[ENTRY_NEW:.*]]
148-
; OTHER: [[ENTRY_NEW]]:
149-
; OTHER-NEXT: br label %[[LOOP_HEADER:.*]]
150-
; OTHER: [[LOOP_HEADER]]:
151-
; OTHER-NEXT: [[PTR_IV1:%.*]] = phi ptr [ [[PTR_IV_UNR]], %[[ENTRY_NEW]] ], [ [[RES:%.*]], %[[LOOP_LATCH_3:.*]] ]
152-
; OTHER-NEXT: [[L1:%.*]] = load i8, ptr [[PTR_IV1]], align 8
153-
; OTHER-NEXT: [[C_4:%.*]] = icmp eq i8 [[L1]], [[TGT]]
154-
; OTHER-NEXT: br i1 [[C_4]], label %[[EXIT_UNR_LCSSA_LOOPEXIT:.*]], label %[[LOOP_LATCH:.*]]
155-
; OTHER: [[LOOP_LATCH]]:
156-
; OTHER-NEXT: [[PTR_IV_NEXT1:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR_IV1]], i64 1
157-
; OTHER-NEXT: [[L_1:%.*]] = load i8, ptr [[PTR_IV_NEXT1]], align 8
158-
; OTHER-NEXT: [[C_1_1:%.*]] = icmp eq i8 [[L_1]], [[TGT]]
159-
; OTHER-NEXT: br i1 [[C_1_1]], label %[[EXIT_UNR_LCSSA_LOOPEXIT]], label %[[LOOP_LATCH_1:.*]]
160-
; OTHER: [[LOOP_LATCH_1]]:
161-
; OTHER-NEXT: [[PTR_IV_NEXT_1:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_NEXT1]], i64 1
162-
; OTHER-NEXT: [[L_2:%.*]] = load i8, ptr [[PTR_IV_NEXT_1]], align 8
163-
; OTHER-NEXT: [[C_1_2:%.*]] = icmp eq i8 [[L_2]], [[TGT]]
164-
; OTHER-NEXT: br i1 [[C_1_2]], label %[[EXIT_UNR_LCSSA_LOOPEXIT]], label %[[LOOP_LATCH_2:.*]]
165-
; OTHER: [[LOOP_LATCH_2]]:
166-
; OTHER-NEXT: [[PTR_IV_NEXT_2:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_NEXT_1]], i64 1
167-
; OTHER-NEXT: [[L_3:%.*]] = load i8, ptr [[PTR_IV_NEXT_2]], align 8
168-
; OTHER-NEXT: [[C_1_3:%.*]] = icmp eq i8 [[L_3]], [[TGT]]
169-
; OTHER-NEXT: br i1 [[C_1_3]], label %[[EXIT_UNR_LCSSA_LOOPEXIT]], label %[[LOOP_LATCH_3]]
170-
; OTHER: [[LOOP_LATCH_3]]:
171-
; OTHER-NEXT: [[RES]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_NEXT_2]], i64 1
172-
; OTHER-NEXT: [[C_3:%.*]] = icmp eq ptr [[RES]], [[END]]
173-
; OTHER-NEXT: br i1 [[C_3]], label %[[EXIT_UNR_LCSSA_LOOPEXIT]], label %[[LOOP_HEADER]]
174-
; OTHER: [[EXIT_UNR_LCSSA_LOOPEXIT]]:
175-
; OTHER-NEXT: [[RES_PH_PH:%.*]] = phi ptr [ [[PTR_IV1]], %[[LOOP_HEADER]] ], [ [[PTR_IV_NEXT1]], %[[LOOP_LATCH]] ], [ [[PTR_IV_NEXT_1]], %[[LOOP_LATCH_1]] ], [ [[PTR_IV_NEXT_2]], %[[LOOP_LATCH_2]] ], [ [[END]], %[[LOOP_LATCH_3]] ]
176-
; OTHER-NEXT: br label %[[EXIT_UNR_LCSSA:.*]]
177-
; OTHER: [[EXIT_UNR_LCSSA_LOOPEXIT3]]:
178-
; OTHER-NEXT: [[RES_PH_PH4:%.*]] = phi ptr [ [[PTR_IV]], %[[LOOP_HEADER_PROL]] ]
179-
; OTHER-NEXT: br label %[[EXIT_UNR_LCSSA]]
180-
; OTHER: [[EXIT_UNR_LCSSA]]:
181-
; OTHER-NEXT: [[RES_PH:%.*]] = phi ptr [ [[RES_PH_PH]], %[[EXIT_UNR_LCSSA_LOOPEXIT]] ], [ [[RES_PH_PH4]], %[[EXIT_UNR_LCSSA_LOOPEXIT3]] ]
182-
; OTHER-NEXT: br label %[[EXIT]]
183-
; OTHER: [[EXIT]]:
184-
; OTHER-NEXT: [[RES1:%.*]] = phi ptr [ [[RES_UNR]], %[[LOOP_HEADER_PROL_LOOPEXIT]] ], [ [[RES_PH]], %[[EXIT_UNR_LCSSA]] ]
185-
; OTHER-NEXT: [[C_5:%.*]] = icmp eq ptr [[RES1]], [[END]]
186-
; OTHER-NEXT: ret i1 [[C_5]]
187-
;
188110
entry:
189111
%start = load ptr, ptr %vec, align 8
190112
%gep.end = getelementptr inbounds nuw i8, ptr %vec, i64 1
@@ -317,89 +239,6 @@ define i1 @multi_2_exit_find_ptr_loop(ptr %vec, ptr %tgt) {
317239
; NOUNROLL-NEXT: [[C_3:%.*]] = icmp eq ptr [[RES]], [[END]]
318240
; NOUNROLL-NEXT: ret i1 [[C_3]]
319241
;
320-
; OTHER-LABEL: define i1 @multi_2_exit_find_ptr_loop(
321-
; OTHER-SAME: ptr [[VEC:%.*]], ptr [[TGT:%.*]]) #[[ATTR0]] {
322-
; OTHER-NEXT: [[ENTRY:.*]]:
323-
; OTHER-NEXT: [[START:%.*]] = load ptr, ptr [[VEC]], align 8
324-
; OTHER-NEXT: [[START2:%.*]] = ptrtoint ptr [[START]] to i64
325-
; OTHER-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[START]], i64 8) ]
326-
; OTHER-NEXT: [[GEP_END:%.*]] = getelementptr inbounds nuw i8, ptr [[VEC]], i64 8
327-
; OTHER-NEXT: [[END:%.*]] = load ptr, ptr [[GEP_END]], align 8
328-
; OTHER-NEXT: [[END1:%.*]] = ptrtoint ptr [[END]] to i64
329-
; OTHER-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[END]], i64 8) ]
330-
; OTHER-NEXT: [[TMP0:%.*]] = add i64 [[END1]], -8
331-
; OTHER-NEXT: [[TMP1:%.*]] = sub i64 [[TMP0]], [[START2]]
332-
; OTHER-NEXT: [[TMP2:%.*]] = lshr i64 [[TMP1]], 3
333-
; OTHER-NEXT: [[TMP3:%.*]] = add nuw nsw i64 [[TMP2]], 1
334-
; OTHER-NEXT: [[TMP4:%.*]] = freeze i64 [[TMP3]]
335-
; OTHER-NEXT: [[TMP5:%.*]] = add i64 [[TMP4]], -1
336-
; OTHER-NEXT: [[XTRAITER:%.*]] = and i64 [[TMP4]], 3
337-
; OTHER-NEXT: [[LCMP_MOD:%.*]] = icmp ne i64 [[XTRAITER]], 0
338-
; OTHER-NEXT: br i1 [[LCMP_MOD]], label %[[LOOP_HEADER_PROL_PREHEADER:.*]], label %[[LOOP_HEADER_PROL_LOOPEXIT:.*]]
339-
; OTHER: [[LOOP_HEADER_PROL_PREHEADER]]:
340-
; OTHER-NEXT: br label %[[LOOP_HEADER_PROL:.*]]
341-
; OTHER: [[LOOP_HEADER_PROL]]:
342-
; OTHER-NEXT: [[PTR_IV_PROL:%.*]] = phi ptr [ [[PTR_IV_NEXT_PROL:%.*]], %[[LOOP_LATCH_PROL:.*]] ], [ [[START]], %[[LOOP_HEADER_PROL_PREHEADER]] ]
343-
; OTHER-NEXT: [[PROL_ITER:%.*]] = phi i64 [ 0, %[[LOOP_HEADER_PROL_PREHEADER]] ], [ [[PROL_ITER_NEXT:%.*]], %[[LOOP_LATCH_PROL]] ]
344-
; OTHER-NEXT: [[L_PROL:%.*]] = load ptr, ptr [[PTR_IV_PROL]], align 8
345-
; OTHER-NEXT: [[C_1_PROL:%.*]] = icmp eq ptr [[L_PROL]], [[TGT]]
346-
; OTHER-NEXT: br i1 [[C_1_PROL]], label %[[EXIT_UNR_LCSSA_LOOPEXIT3:.*]], label %[[LOOP_LATCH_PROL]]
347-
; OTHER: [[LOOP_LATCH_PROL]]:
348-
; OTHER-NEXT: [[PTR_IV_NEXT_PROL]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_PROL]], i64 8
349-
; OTHER-NEXT: [[C_2_PROL:%.*]] = icmp eq ptr [[PTR_IV_NEXT_PROL]], [[END]]
350-
; OTHER-NEXT: [[PROL_ITER_NEXT]] = add i64 [[PROL_ITER]], 1
351-
; OTHER-NEXT: [[PROL_ITER_CMP:%.*]] = icmp ne i64 [[PROL_ITER_NEXT]], [[XTRAITER]]
352-
; OTHER-NEXT: br i1 [[PROL_ITER_CMP]], label %[[LOOP_HEADER_PROL]], label %[[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA:.*]], !llvm.loop [[LOOP2:![0-9]+]]
353-
; OTHER: [[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA]]:
354-
; OTHER-NEXT: [[RES_UNR_PH:%.*]] = phi ptr [ [[END]], %[[LOOP_LATCH_PROL]] ]
355-
; OTHER-NEXT: [[PTR_IV_UNR_PH:%.*]] = phi ptr [ [[PTR_IV_NEXT_PROL]], %[[LOOP_LATCH_PROL]] ]
356-
; OTHER-NEXT: br label %[[LOOP_HEADER_PROL_LOOPEXIT]]
357-
; OTHER: [[LOOP_HEADER_PROL_LOOPEXIT]]:
358-
; OTHER-NEXT: [[RES_UNR:%.*]] = phi ptr [ poison, %[[ENTRY]] ], [ [[RES_UNR_PH]], %[[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA]] ]
359-
; OTHER-NEXT: [[PTR_IV_UNR:%.*]] = phi ptr [ [[START]], %[[ENTRY]] ], [ [[PTR_IV_UNR_PH]], %[[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA]] ]
360-
; OTHER-NEXT: [[TMP6:%.*]] = icmp ult i64 [[TMP5]], 3
361-
; OTHER-NEXT: br i1 [[TMP6]], label %[[EXIT:.*]], label %[[ENTRY_NEW:.*]]
362-
; OTHER: [[ENTRY_NEW]]:
363-
; OTHER-NEXT: br label %[[LOOP_HEADER:.*]]
364-
; OTHER: [[LOOP_HEADER]]:
365-
; OTHER-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_UNR]], %[[ENTRY_NEW]] ], [ [[PTR_IV_NEXT_3:%.*]], %[[LOOP_LATCH_3:.*]] ]
366-
; OTHER-NEXT: [[L:%.*]] = load ptr, ptr [[PTR_IV]], align 8
367-
; OTHER-NEXT: [[C_1:%.*]] = icmp eq ptr [[L]], [[TGT]]
368-
; OTHER-NEXT: br i1 [[C_1]], label %[[EXIT_UNR_LCSSA_LOOPEXIT:.*]], label %[[LOOP_LATCH:.*]]
369-
; OTHER: [[LOOP_LATCH]]:
370-
; OTHER-NEXT: [[PTR_IV_NEXT:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 8
371-
; OTHER-NEXT: [[L_1:%.*]] = load ptr, ptr [[PTR_IV_NEXT]], align 8
372-
; OTHER-NEXT: [[C_1_1:%.*]] = icmp eq ptr [[L_1]], [[TGT]]
373-
; OTHER-NEXT: br i1 [[C_1_1]], label %[[EXIT_UNR_LCSSA_LOOPEXIT]], label %[[LOOP_LATCH_1:.*]]
374-
; OTHER: [[LOOP_LATCH_1]]:
375-
; OTHER-NEXT: [[PTR_IV_NEXT_1:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_NEXT]], i64 8
376-
; OTHER-NEXT: [[L_2:%.*]] = load ptr, ptr [[PTR_IV_NEXT_1]], align 8
377-
; OTHER-NEXT: [[C_1_2:%.*]] = icmp eq ptr [[L_2]], [[TGT]]
378-
; OTHER-NEXT: br i1 [[C_1_2]], label %[[EXIT_UNR_LCSSA_LOOPEXIT]], label %[[LOOP_LATCH_2:.*]]
379-
; OTHER: [[LOOP_LATCH_2]]:
380-
; OTHER-NEXT: [[PTR_IV_NEXT_2:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_NEXT_1]], i64 8
381-
; OTHER-NEXT: [[L_3:%.*]] = load ptr, ptr [[PTR_IV_NEXT_2]], align 8
382-
; OTHER-NEXT: [[C_1_3:%.*]] = icmp eq ptr [[L_3]], [[TGT]]
383-
; OTHER-NEXT: br i1 [[C_1_3]], label %[[EXIT_UNR_LCSSA_LOOPEXIT]], label %[[LOOP_LATCH_3]]
384-
; OTHER: [[LOOP_LATCH_3]]:
385-
; OTHER-NEXT: [[PTR_IV_NEXT_3]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_NEXT_2]], i64 8
386-
; OTHER-NEXT: [[C_2_3:%.*]] = icmp eq ptr [[PTR_IV_NEXT_3]], [[END]]
387-
; OTHER-NEXT: br i1 [[C_2_3]], label %[[EXIT_UNR_LCSSA_LOOPEXIT]], label %[[LOOP_HEADER]]
388-
; OTHER: [[EXIT_UNR_LCSSA_LOOPEXIT]]:
389-
; OTHER-NEXT: [[RES_PH_PH:%.*]] = phi ptr [ [[PTR_IV]], %[[LOOP_HEADER]] ], [ [[PTR_IV_NEXT]], %[[LOOP_LATCH]] ], [ [[PTR_IV_NEXT_1]], %[[LOOP_LATCH_1]] ], [ [[PTR_IV_NEXT_2]], %[[LOOP_LATCH_2]] ], [ [[END]], %[[LOOP_LATCH_3]] ]
390-
; OTHER-NEXT: br label %[[EXIT_UNR_LCSSA:.*]]
391-
; OTHER: [[EXIT_UNR_LCSSA_LOOPEXIT3]]:
392-
; OTHER-NEXT: [[RES_PH_PH4:%.*]] = phi ptr [ [[PTR_IV_PROL]], %[[LOOP_HEADER_PROL]] ]
393-
; OTHER-NEXT: br label %[[EXIT_UNR_LCSSA]]
394-
; OTHER: [[EXIT_UNR_LCSSA]]:
395-
; OTHER-NEXT: [[RES_PH:%.*]] = phi ptr [ [[RES_PH_PH]], %[[EXIT_UNR_LCSSA_LOOPEXIT]] ], [ [[RES_PH_PH4]], %[[EXIT_UNR_LCSSA_LOOPEXIT3]] ]
396-
; OTHER-NEXT: br label %[[EXIT]]
397-
; OTHER: [[EXIT]]:
398-
; OTHER-NEXT: [[RES:%.*]] = phi ptr [ [[RES_UNR]], %[[LOOP_HEADER_PROL_LOOPEXIT]] ], [ [[RES_PH]], %[[EXIT_UNR_LCSSA]] ]
399-
; OTHER-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[END]], i64 8) ]
400-
; OTHER-NEXT: [[C_3:%.*]] = icmp eq ptr [[RES]], [[END]]
401-
; OTHER-NEXT: ret i1 [[C_3]]
402-
;
403242
entry:
404243
%start = load ptr, ptr %vec, align 8
405244
call void @llvm.assume(i1 true) [ "align"(ptr %start, i64 8) ]
@@ -473,29 +312,6 @@ define i1 @multi_2_exit_find_i8_loop_too_large(ptr %vec, i8 %tgt) {
473312
; NOUNROLL-NEXT: [[C_3:%.*]] = icmp eq ptr [[RES]], [[END]]
474313
; NOUNROLL-NEXT: ret i1 [[C_3]]
475314
;
476-
; OTHER-LABEL: define i1 @multi_2_exit_find_i8_loop_too_large(
477-
; OTHER-SAME: ptr [[VEC:%.*]], i8 [[TGT:%.*]]) #[[ATTR0]] {
478-
; OTHER-NEXT: [[ENTRY:.*]]:
479-
; OTHER-NEXT: [[START:%.*]] = load ptr, ptr [[VEC]], align 8
480-
; OTHER-NEXT: [[GEP_END:%.*]] = getelementptr inbounds nuw i8, ptr [[VEC]], i64 1
481-
; OTHER-NEXT: [[END:%.*]] = load ptr, ptr [[GEP_END]], align 8
482-
; OTHER-NEXT: br label %[[LOOP_HEADER:.*]]
483-
; OTHER: [[LOOP_HEADER]]:
484-
; OTHER-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ], [ [[START]], %[[ENTRY]] ]
485-
; OTHER-NEXT: [[L:%.*]] = load i8, ptr [[PTR_IV]], align 8
486-
; OTHER-NEXT: [[UDIV:%.*]] = udiv i8 [[L]], [[TGT]]
487-
; OTHER-NEXT: [[UDIV_2:%.*]] = udiv i8 [[UDIV]], 10
488-
; OTHER-NEXT: [[C_1:%.*]] = icmp eq i8 [[UDIV_2]], 2
489-
; OTHER-NEXT: br i1 [[C_1]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]
490-
; OTHER: [[LOOP_LATCH]]:
491-
; OTHER-NEXT: [[PTR_IV_NEXT]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 1
492-
; OTHER-NEXT: [[C_2:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END]]
493-
; OTHER-NEXT: br i1 [[C_2]], label %[[EXIT]], label %[[LOOP_HEADER]]
494-
; OTHER: [[EXIT]]:
495-
; OTHER-NEXT: [[RES:%.*]] = phi ptr [ [[PTR_IV]], %[[LOOP_HEADER]] ], [ [[END]], %[[LOOP_LATCH]] ]
496-
; OTHER-NEXT: [[C_3:%.*]] = icmp eq ptr [[RES]], [[END]]
497-
; OTHER-NEXT: ret i1 [[C_3]]
498-
;
499315
entry:
500316
%start = load ptr, ptr %vec, align 8
501317
%gep.end = getelementptr inbounds nuw i8, ptr %vec, i64 1
@@ -574,32 +390,6 @@ define i1 @multi_3_exit_find_ptr_loop(ptr %vec, ptr %tgt, ptr %tgt2) {
574390
; NOUNROLL-NEXT: [[C_4:%.*]] = icmp eq ptr [[RES]], [[END]]
575391
; NOUNROLL-NEXT: ret i1 [[C_4]]
576392
;
577-
; OTHER-LABEL: define i1 @multi_3_exit_find_ptr_loop(
578-
; OTHER-SAME: ptr [[VEC:%.*]], ptr [[TGT:%.*]], ptr [[TGT2:%.*]]) #[[ATTR0]] {
579-
; OTHER-NEXT: [[ENTRY:.*]]:
580-
; OTHER-NEXT: [[START:%.*]] = load ptr, ptr [[VEC]], align 8
581-
; OTHER-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[START]], i64 8) ]
582-
; OTHER-NEXT: [[GEP_END:%.*]] = getelementptr inbounds nuw i8, ptr [[VEC]], i64 8
583-
; OTHER-NEXT: [[END:%.*]] = load ptr, ptr [[GEP_END]], align 8
584-
; OTHER-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[END]], i64 8) ]
585-
; OTHER-NEXT: br label %[[LOOP_HEADER:.*]]
586-
; OTHER: [[LOOP_HEADER]]:
587-
; OTHER-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ], [ [[START]], %[[ENTRY]] ]
588-
; OTHER-NEXT: [[L:%.*]] = load ptr, ptr [[PTR_IV]], align 8
589-
; OTHER-NEXT: [[C_1:%.*]] = icmp eq ptr [[L]], [[TGT]]
590-
; OTHER-NEXT: [[C_2:%.*]] = icmp eq ptr [[L]], [[TGT2]]
591-
; OTHER-NEXT: [[OR_COND:%.*]] = select i1 [[C_1]], i1 true, i1 [[C_2]]
592-
; OTHER-NEXT: br i1 [[OR_COND]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]
593-
; OTHER: [[LOOP_LATCH]]:
594-
; OTHER-NEXT: [[PTR_IV_NEXT]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 8
595-
; OTHER-NEXT: [[C_3:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END]]
596-
; OTHER-NEXT: br i1 [[C_3]], label %[[EXIT]], label %[[LOOP_HEADER]]
597-
; OTHER: [[EXIT]]:
598-
; OTHER-NEXT: [[RES:%.*]] = phi ptr [ [[PTR_IV]], %[[LOOP_HEADER]] ], [ [[END]], %[[LOOP_LATCH]] ]
599-
; OTHER-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[END]], i64 8) ]
600-
; OTHER-NEXT: [[C_4:%.*]] = icmp eq ptr [[RES]], [[END]]
601-
; OTHER-NEXT: ret i1 [[C_4]]
602-
;
603393
entry:
604394
%start = load ptr, ptr %vec, align 8
605395
call void @llvm.assume(i1 true) [ "align"(ptr %start, i64 8) ]
@@ -687,34 +477,6 @@ define i1 @multi_3_exit_find_i8_loop_switch(ptr %vec, i8 %tgt) {
687477
; NOUNROLL: [[EXIT_2]]:
688478
; NOUNROLL-NEXT: ret i1 true
689479
;
690-
; OTHER-LABEL: define i1 @multi_3_exit_find_i8_loop_switch(
691-
; OTHER-SAME: ptr [[VEC:%.*]], i8 [[TGT:%.*]]) #[[ATTR0]] {
692-
; OTHER-NEXT: [[ENTRY:.*]]:
693-
; OTHER-NEXT: [[START:%.*]] = load ptr, ptr [[VEC]], align 8
694-
; OTHER-NEXT: [[GEP_END:%.*]] = getelementptr inbounds nuw i8, ptr [[VEC]], i64 1
695-
; OTHER-NEXT: [[END:%.*]] = load ptr, ptr [[GEP_END]], align 8
696-
; OTHER-NEXT: br label %[[LOOP_HEADER:.*]]
697-
; OTHER: [[LOOP_HEADER]]:
698-
; OTHER-NEXT: [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ], [ [[START]], %[[ENTRY]] ]
699-
; OTHER-NEXT: [[L:%.*]] = load i8, ptr [[PTR_IV]], align 8
700-
; OTHER-NEXT: switch i8 [[L]], label %[[LOOP_LATCH]] [
701-
; OTHER-NEXT: i8 0, label %[[EXIT_1:.*]]
702-
; OTHER-NEXT: i8 1, label %[[EXIT_2:.*]]
703-
; OTHER-NEXT: i8 2, label %[[EXIT:.*]]
704-
; OTHER-NEXT: ]
705-
; OTHER: [[LOOP_LATCH]]:
706-
; OTHER-NEXT: [[PTR_IV_NEXT]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 1
707-
; OTHER-NEXT: [[C_2:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END]]
708-
; OTHER-NEXT: br i1 [[C_2]], label %[[EXIT]], label %[[LOOP_HEADER]]
709-
; OTHER: [[EXIT]]:
710-
; OTHER-NEXT: [[RES:%.*]] = phi ptr [ [[PTR_IV]], %[[LOOP_HEADER]] ], [ [[END]], %[[LOOP_LATCH]] ]
711-
; OTHER-NEXT: [[C_3:%.*]] = icmp eq ptr [[RES]], [[END]]
712-
; OTHER-NEXT: ret i1 [[C_3]]
713-
; OTHER: [[EXIT_1]]:
714-
; OTHER-NEXT: ret i1 false
715-
; OTHER: [[EXIT_2]]:
716-
; OTHER-NEXT: ret i1 true
717-
;
718480
entry:
719481
%start = load ptr, ptr %vec, align 8
720482
%gep.end = getelementptr inbounds nuw i8, ptr %vec, i64 1

0 commit comments

Comments
 (0)