brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · cd2ed37 Raw
58 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 32 3;; Check that -enable-loop-header-duplication at Oz enables certain types of4;; optimizations, for example replacing the loop body w/ a call to memset. If5;; loop idiom recognition begins to recognize unrotated loops, this test will6;; need to be updated.7 8; RUN: opt -passes='default<Oz>' -S < %s  | FileCheck %s --check-prefix=NOROTATION9; RUN: opt -passes='default<Oz>' -S  -enable-loop-header-duplication < %s  | FileCheck %s --check-prefix=ROTATION10; RUN: opt -passes='default<O2>' -S  < %s  | FileCheck %s --check-prefix=ROTATION11 12define 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 captures(address) [[START:%.*]], ptr readnone captures(address) [[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 123; NOROTATION-NEXT:    store i8 1, ptr [[PTR_IV]], align 124; NOROTATION-NEXT:    br label [[LOOP_HEADER]]25; NOROTATION:       exit:26; NOROTATION-NEXT:    ret void27;28; ROTATION-LABEL: define void @test(29; ROTATION-SAME: ptr noalias nonnull writeonly align 1 captures(address) [[START:%.*]], ptr readnone captures(address) [[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 i6435; ROTATION-NEXT:    [[START4:%.*]] = ptrtoint ptr [[START]] to i6436; 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 void41;42entry:43  br label %loop.header44 45loop.header:46  %ptr.iv = phi i8* [ %start, %entry ], [ %ptr.iv.next, %loop.latch ]47  %_12.i = icmp eq i8* %ptr.iv, %end48  br i1 %_12.i, label %exit, label %loop.latch49 50loop.latch:51  %ptr.iv.next = getelementptr inbounds i8, i8* %ptr.iv, i64 152  store i8 1, i8* %ptr.iv, align 153  br label %loop.header54 55exit:56  ret void57}58