69 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=memcpyopt < %s | FileCheck %s3 4define void @test_copy_uninit(ptr %arg) {5; CHECK-LABEL: @test_copy_uninit(6; CHECK-NEXT: start:7; CHECK-NEXT: [[ALLOCA:%.*]] = alloca [1000 x i32], align 48; CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [1000 x [1000 x i32]], ptr [[ARG:%.*]], i64 0, i64 10009; CHECK-NEXT: br label [[LOOP:%.*]]10; CHECK: loop:11; CHECK-NEXT: [[CURRENT:%.*]] = phi ptr [ [[ARG]], [[START:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]12; CHECK-NEXT: [[NEXT]] = getelementptr inbounds [1000 x i32], ptr [[CURRENT]], i64 113; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[NEXT]], [[END]]14; CHECK-NEXT: br i1 [[COND]], label [[EXIT:%.*]], label [[LOOP]]15; CHECK: exit:16; CHECK-NEXT: ret void17;18start:19 %alloca = alloca [1000 x i32], align 420 %end = getelementptr inbounds [1000 x [1000 x i32]], ptr %arg, i64 0, i64 100021 br label %loop22 23loop: ; preds = %loop, %start24 %current = phi ptr [ %arg, %start ], [ %next, %loop ]25 call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 4 dereferenceable(4000) %current, ptr nonnull align 4 dereferenceable(4000) %alloca, i64 4000, i1 false)26 %next = getelementptr inbounds [1000 x i32], ptr %current, i64 127 %cond = icmp eq ptr %next, %end28 br i1 %cond, label %exit, label %loop29 30exit: ; preds = %loop31 ret void32}33 34define void @test_copy_zero(ptr %arg) {35; CHECK-LABEL: @test_copy_zero(36; CHECK-NEXT: start:37; CHECK-NEXT: [[ALLOCA:%.*]] = alloca [1000 x i32], align 438; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr nonnull align 4 dereferenceable(4000) [[ALLOCA]], i8 0, i64 4000, i1 false)39; CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [1000 x [1000 x i32]], ptr [[ARG:%.*]], i64 0, i64 100040; CHECK-NEXT: br label [[LOOP:%.*]]41; CHECK: loop:42; CHECK-NEXT: [[CURRENT:%.*]] = phi ptr [ [[ARG]], [[START:%.*]] ], [ [[NEXT:%.*]], [[LOOP]] ]43; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[CURRENT]], i8 0, i64 4000, i1 false)44; CHECK-NEXT: [[NEXT]] = getelementptr inbounds [1000 x i32], ptr [[CURRENT]], i64 145; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[NEXT]], [[END]]46; CHECK-NEXT: br i1 [[COND]], label [[EXIT:%.*]], label [[LOOP]]47; CHECK: exit:48; CHECK-NEXT: ret void49;50start:51 %alloca = alloca [1000 x i32], align 452 call void @llvm.memset.p0.i64(ptr nonnull align 4 dereferenceable(4000) %alloca, i8 0, i64 4000, i1 false)53 %end = getelementptr inbounds [1000 x [1000 x i32]], ptr %arg, i64 0, i64 100054 br label %loop55 56loop: ; preds = %loop, %start57 %current = phi ptr [ %arg, %start ], [ %next, %loop ]58 call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 4 dereferenceable(4000) %current, ptr nonnull align 4 dereferenceable(4000) %alloca, i64 4000, i1 false)59 %next = getelementptr inbounds [1000 x i32], ptr %current, i64 160 %cond = icmp eq ptr %next, %end61 br i1 %cond, label %exit, label %loop62 63exit: ; preds = %loop64 ret void65}66 67declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg)68declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg)69