xref: /llvm-project/llvm/test/Transforms/PhaseOrdering/enable-loop-header-duplication-oz.ll (revision f7685af4a5bd188e6d548967d818d8569f10a70d)
12fef6853SPaul Kirth; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
22fef6853SPaul Kirth
32fef6853SPaul Kirth;; Check that -enable-loop-header-duplication at Oz enables certain types of
42fef6853SPaul Kirth;; optimizations, for example replacing the loop body w/ a call to memset. If
52fef6853SPaul Kirth;; loop idiom recognition begins to recognize unrotated loops, this test will
62fef6853SPaul Kirth;; need to be updated.
72fef6853SPaul Kirth
82fef6853SPaul Kirth; RUN: opt -passes='default<Oz>' -S < %s  | FileCheck %s --check-prefix=NOROTATION
92fef6853SPaul Kirth; RUN: opt -passes='default<Oz>' -S  -enable-loop-header-duplication < %s  | FileCheck %s --check-prefix=ROTATION
102fef6853SPaul Kirth; RUN: opt -passes='default<O2>' -S  < %s  | FileCheck %s --check-prefix=ROTATION
112fef6853SPaul Kirth
122fef6853SPaul Kirthdefine void @test(i8* noalias nonnull align 1 %start, i8* %end) unnamed_addr {
132fef6853SPaul Kirth; NOROTATION-LABEL: define void @test(
142fef6853SPaul Kirth; NOROTATION-SAME: ptr noalias nonnull writeonly align 1 [[START:%.*]], ptr readnone [[END:%.*]]) unnamed_addr #[[ATTR0:[0-9]+]] {
152fef6853SPaul Kirth; NOROTATION-NEXT:  entry:
162fef6853SPaul Kirth; NOROTATION-NEXT:    br label [[LOOP_HEADER:%.*]]
172fef6853SPaul Kirth; NOROTATION:       loop.header:
182fef6853SPaul Kirth; NOROTATION-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START]], [[ENTRY:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
192fef6853SPaul Kirth; NOROTATION-NEXT:    [[_12_I:%.*]] = icmp eq ptr [[PTR_IV]], [[END]]
202fef6853SPaul Kirth; NOROTATION-NEXT:    br i1 [[_12_I]], label [[EXIT:%.*]], label [[LOOP_LATCH]]
212fef6853SPaul Kirth; NOROTATION:       loop.latch:
22*f7685af4SNikita Popov; NOROTATION-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 1
232fef6853SPaul Kirth; NOROTATION-NEXT:    store i8 1, ptr [[PTR_IV]], align 1
242fef6853SPaul Kirth; NOROTATION-NEXT:    br label [[LOOP_HEADER]]
252fef6853SPaul Kirth; NOROTATION:       exit:
262fef6853SPaul Kirth; NOROTATION-NEXT:    ret void
272fef6853SPaul Kirth;
282fef6853SPaul Kirth; ROTATION-LABEL: define void @test(
292fef6853SPaul Kirth; ROTATION-SAME: ptr noalias nonnull writeonly align 1 [[START:%.*]], ptr readnone [[END:%.*]]) unnamed_addr #[[ATTR0:[0-9]+]] {
302fef6853SPaul Kirth; ROTATION-NEXT:  entry:
312fef6853SPaul Kirth; ROTATION-NEXT:    [[_12_I1:%.*]] = icmp eq ptr [[START]], [[END]]
322fef6853SPaul Kirth; ROTATION-NEXT:    br i1 [[_12_I1]], label [[EXIT:%.*]], label [[LOOP_LATCH_PREHEADER:%.*]]
332fef6853SPaul Kirth; ROTATION:       loop.latch.preheader:
342fef6853SPaul Kirth; ROTATION-NEXT:    [[END3:%.*]] = ptrtoint ptr [[END]] to i64
352fef6853SPaul Kirth; ROTATION-NEXT:    [[START4:%.*]] = ptrtoint ptr [[START]] to i64
362fef6853SPaul Kirth; ROTATION-NEXT:    [[TMP0:%.*]] = sub i64 [[END3]], [[START4]]
372fef6853SPaul Kirth; ROTATION-NEXT:    tail call void @llvm.memset.p0.i64(ptr nonnull align 1 [[START]], i8 1, i64 [[TMP0]], i1 false)
382fef6853SPaul Kirth; ROTATION-NEXT:    br label [[EXIT]]
392fef6853SPaul Kirth; ROTATION:       exit:
402fef6853SPaul Kirth; ROTATION-NEXT:    ret void
412fef6853SPaul Kirth;
422fef6853SPaul Kirthentry:
432fef6853SPaul Kirth  br label %loop.header
442fef6853SPaul Kirth
452fef6853SPaul Kirthloop.header:
462fef6853SPaul Kirth  %ptr.iv = phi i8* [ %start, %entry ], [ %ptr.iv.next, %loop.latch ]
472fef6853SPaul Kirth  %_12.i = icmp eq i8* %ptr.iv, %end
482fef6853SPaul Kirth  br i1 %_12.i, label %exit, label %loop.latch
492fef6853SPaul Kirth
502fef6853SPaul Kirthloop.latch:
512fef6853SPaul Kirth  %ptr.iv.next = getelementptr inbounds i8, i8* %ptr.iv, i64 1
522fef6853SPaul Kirth  store i8 1, i8* %ptr.iv, align 1
532fef6853SPaul Kirth  br label %loop.header
542fef6853SPaul Kirth
552fef6853SPaul Kirthexit:
562fef6853SPaul Kirth  ret void
572fef6853SPaul Kirth}
58