Skip to content

Commit 1b72106

Browse files
committed
SILOptimizer: Teach loop unrolling about more kinds of increment operations
1 parent 66d601c commit 1b72106

File tree

2 files changed

+89
-1
lines changed

2 files changed

+89
-1
lines changed

lib/SILOptimizer/LoopTransforms/LoopUnroll.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,11 +163,21 @@ static Optional<uint64_t> getMaxLoopTripCount(SILLoop *Loop,
163163

164164
SILValue RecNext = Cmp->getArguments()[0];
165165
SILPhiArgument *RecArg;
166+
167+
// Match signed add with overflow, unsigned add with overflow and
168+
// add without overflow.
166169
if (!match(RecNext, m_TupleExtractOperation(
167170
m_ApplyInst(BuiltinValueKind::SAddOver,
168171
m_SILPhiArgument(RecArg), m_One()),
169-
0)))
172+
0)) &&
173+
!match(RecNext, m_TupleExtractOperation(
174+
m_ApplyInst(BuiltinValueKind::UAddOver,
175+
m_SILPhiArgument(RecArg), m_One()),
176+
0)) &&
177+
!match(RecNext, m_ApplyInst(BuiltinValueKind::Add,
178+
m_SILPhiArgument(RecArg), m_One()))) {
170179
return None;
180+
}
171181

172182
if (RecArg->getParent() != Header)
173183
return None;

test/SILOptimizer/loop_unroll.sil

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,84 @@ bb6(%72 : $Builtin.Int64):
297297
return %401 : $()
298298
}
299299

300+
// CHECK-LABEL: sil @loop_unroll_unsigned_overflow_1
301+
// CHECK: bb0
302+
// CHECK: br bb1
303+
// CHECK: bb1
304+
// CHECK: builtin "uadd_with_overflow_Word"
305+
// CHECK: cond_br {{.*}}, bb2, bb3
306+
// CHECK: bb2
307+
// CHECK: br bb7
308+
// CHECK: bb3
309+
// CHECK: br bb4
310+
// CHECK: bb4
311+
// CHECK: builtin "uadd_with_overflow_Word"
312+
// CHECK: br bb5
313+
// CHECK: bb5
314+
// CHECK: br bb7
315+
// CHECK: bb7:
316+
// CHECK: return
317+
318+
sil @loop_unroll_unsigned_overflow_1 : $@convention(thin) () -> () {
319+
bb0:
320+
%0 = integer_literal $Builtin.Word, 0
321+
%1 = integer_literal $Builtin.Word, 1
322+
%2 = integer_literal $Builtin.Word, 2
323+
%3 = integer_literal $Builtin.Int1, 1
324+
br bb1(%0 : $Builtin.Word)
325+
326+
bb1(%4 : $Builtin.Word):
327+
%5 = builtin "uadd_with_overflow_Word"(%4 : $Builtin.Word, %1 : $Builtin.Word, %3 : $Builtin.Int1) : $(Builtin.Word, Builtin.Int1)
328+
%6 = tuple_extract %5 : $(Builtin.Word, Builtin.Int1), 0
329+
%7 = builtin "cmp_eq_Word"(%6 : $Builtin.Word, %2 : $Builtin.Word) : $Builtin.Int1
330+
cond_br %7, bb3, bb2
331+
332+
bb2:
333+
br bb1(%6 : $Builtin.Word)
334+
335+
bb3:
336+
%9 = tuple()
337+
return %9 : $()
338+
}
339+
340+
// CHECK-LABEL: sil @loop_unroll_no_overflow_1
341+
// CHECK: bb0
342+
// CHECK: br bb1
343+
// CHECK: bb1
344+
// CHECK: builtin "add_Int64"
345+
// CHECK: cond_br {{.*}}, bb2, bb3
346+
// CHECK: bb2
347+
// CHECK: br bb7
348+
// CHECK: bb3
349+
// CHECK: br bb4
350+
// CHECK: bb4
351+
// CHECK: builtin "add_Int64"
352+
// CHECK: br bb5
353+
// CHECK: bb5
354+
// CHECK: br bb7
355+
// CHECK: bb7:
356+
// CHECK: return
357+
358+
sil @loop_unroll_no_overflow_1 : $@convention(thin) () -> () {
359+
bb0:
360+
%0 = integer_literal $Builtin.Int64, 0
361+
%1 = integer_literal $Builtin.Int64, 1
362+
%2 = integer_literal $Builtin.Int64, 2
363+
br bb1(%0 : $Builtin.Int64)
364+
365+
bb1(%4 : $Builtin.Int64):
366+
%5 = builtin "add_Int64"(%4 : $Builtin.Int64, %1 : $Builtin.Int64) : $Builtin.Int64
367+
%7 = builtin "cmp_eq_Int64"(%5 : $Builtin.Int64, %2 : $Builtin.Int64) : $Builtin.Int1
368+
cond_br %7, bb3, bb2
369+
370+
bb2:
371+
br bb1(%5 : $Builtin.Int64)
372+
373+
bb3:
374+
%9 = tuple()
375+
return %9 : $()
376+
}
377+
300378
// CHECK-LABEL: sil @unroll_with_exit_block_arg_2
301379
// CHECK: bb1({{.*}}):
302380
// CHECK: cond_br {{.*}}, bb4, bb2

0 commit comments

Comments
 (0)