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