[MachineScheduler] Fix physreg dependencies of ExitSU (#123541)
[llvm-project.git] / llvm / test / Transforms / PhaseOrdering / enable-loop-header-duplication-oz.ll
blob5f75bd788e4bb46c998101ee278ecc3d7e006fd9
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
3 ;; Check that -enable-loop-header-duplication at Oz enables certain types of
4 ;; optimizations, for example replacing the loop body w/ a call to memset. If
5 ;; loop idiom recognition begins to recognize unrotated loops, this test will
6 ;; need to be updated.
8 ; RUN: opt -passes='default<Oz>' -S < %s  | FileCheck %s --check-prefix=NOROTATION
9 ; RUN: opt -passes='default<Oz>' -S  -enable-loop-header-duplication < %s  | FileCheck %s --check-prefix=ROTATION
10 ; RUN: opt -passes='default<O2>' -S  < %s  | FileCheck %s --check-prefix=ROTATION
12 define void @test(i8* noalias nonnull align 1 %start, i8* %end) unnamed_addr {
13 ; NOROTATION-LABEL: define void @test(
14 ; NOROTATION-SAME: ptr noalias nonnull writeonly align 1 [[START:%.*]], ptr readnone [[END:%.*]]) unnamed_addr #[[ATTR0:[0-9]+]] {
15 ; NOROTATION-NEXT:  entry:
16 ; NOROTATION-NEXT:    br label [[LOOP_HEADER:%.*]]
17 ; NOROTATION:       loop.header:
18 ; NOROTATION-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START]], [[ENTRY:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
19 ; NOROTATION-NEXT:    [[_12_I:%.*]] = icmp eq ptr [[PTR_IV]], [[END]]
20 ; NOROTATION-NEXT:    br i1 [[_12_I]], label [[EXIT:%.*]], label [[LOOP_LATCH]]
21 ; NOROTATION:       loop.latch:
22 ; NOROTATION-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 1
23 ; NOROTATION-NEXT:    store i8 1, ptr [[PTR_IV]], align 1
24 ; NOROTATION-NEXT:    br label [[LOOP_HEADER]]
25 ; NOROTATION:       exit:
26 ; NOROTATION-NEXT:    ret void
28 ; ROTATION-LABEL: define void @test(
29 ; ROTATION-SAME: ptr noalias nonnull writeonly align 1 [[START:%.*]], ptr readnone [[END:%.*]]) unnamed_addr #[[ATTR0:[0-9]+]] {
30 ; ROTATION-NEXT:  entry:
31 ; ROTATION-NEXT:    [[_12_I1:%.*]] = icmp eq ptr [[START]], [[END]]
32 ; ROTATION-NEXT:    br i1 [[_12_I1]], label [[EXIT:%.*]], label [[LOOP_LATCH_PREHEADER:%.*]]
33 ; ROTATION:       loop.latch.preheader:
34 ; ROTATION-NEXT:    [[END3:%.*]] = ptrtoint ptr [[END]] to i64
35 ; ROTATION-NEXT:    [[START4:%.*]] = ptrtoint ptr [[START]] to i64
36 ; ROTATION-NEXT:    [[TMP0:%.*]] = sub i64 [[END3]], [[START4]]
37 ; ROTATION-NEXT:    tail call void @llvm.memset.p0.i64(ptr nonnull align 1 [[START]], i8 1, i64 [[TMP0]], i1 false)
38 ; ROTATION-NEXT:    br label [[EXIT]]
39 ; ROTATION:       exit:
40 ; ROTATION-NEXT:    ret void
42 entry:
43   br label %loop.header
45 loop.header:
46   %ptr.iv = phi i8* [ %start, %entry ], [ %ptr.iv.next, %loop.latch ]
47   %_12.i = icmp eq i8* %ptr.iv, %end
48   br i1 %_12.i, label %exit, label %loop.latch
50 loop.latch:
51   %ptr.iv.next = getelementptr inbounds i8, i8* %ptr.iv, i64 1
52   store i8 1, i8* %ptr.iv, align 1
53   br label %loop.header
55 exit:
56   ret void