74 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=memcpyopt -S -verify-memoryssa | FileCheck %s3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"4 5define void @test(ptr %src, i64 %size) {6; CHECK-LABEL: @test(7; CHECK-NEXT: [[TMP:%.*]] = alloca i8, i64 [[SIZE:%.*]], align 18; CHECK-NEXT: [[DST:%.*]] = alloca i8, i64 [[SIZE]], align 19; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[TMP]], ptr align 8 [[SRC:%.*]], i64 [[SIZE]], i1 false)10; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[DST]], ptr align 8 [[SRC]], i64 [[SIZE]], i1 false)11; CHECK-NEXT: ret void12;13 %tmp = alloca i8, i64 %size14 %dst = alloca i8, i64 %size15 call void @llvm.memcpy.p0.p0.i64(ptr align 8 %tmp, ptr align 8 %src, i64 %size, i1 false)16 call void @llvm.memcpy.p0.p0.i64(ptr align 8 %dst, ptr align 8 %tmp, i64 %size, i1 false)17 18 ret void19}20 21define void @dynalloca_test(ptr %src, i64 %size1) {22; CHECK-LABEL: @dynalloca_test(23; CHECK-NEXT: [[TMP:%.*]] = alloca i8, i64 [[SIZE1:%.*]], align 124; CHECK-NEXT: [[DST:%.*]] = alloca i8, i64 [[SIZE1]], align 125; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[TMP]], ptr align 8 [[SRC:%.*]], i64 31, i1 false)26; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[DST]], ptr align 8 [[SRC]], i64 31, i1 false)27; CHECK-NEXT: ret void28;29 %tmp = alloca i8, i64 %size130 %dst = alloca i8, i64 %size131 call void @llvm.memcpy.p0.p0.i64(ptr align 8 %tmp, ptr align 8 %src, i64 31, i1 false)32 call void @llvm.memcpy.p0.p0.i64(ptr align 8 %dst, ptr align 8 %tmp, i64 32, i1 false)33 34 ret void35}36 37define void @dynalloca_offset_test(ptr %src, i64 %size1) {38; CHECK-LABEL: @dynalloca_offset_test(39; CHECK-NEXT: [[TMP:%.*]] = alloca i8, i64 [[SIZE1:%.*]], align 140; CHECK-NEXT: [[DST:%.*]] = alloca i8, i64 [[SIZE1]], align 141; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[TMP]], ptr align 8 [[SRC:%.*]], i64 31, i1 false)42; CHECK-NEXT: [[TMP_OFFSET:%.*]] = getelementptr inbounds i8, ptr [[TMP]], i64 143; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i64 144; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[DST]], ptr align 1 [[TMP1]], i64 30, i1 false)45; CHECK-NEXT: ret void46;47 %tmp = alloca i8, i64 %size148 %dst = alloca i8, i64 %size149 call void @llvm.memcpy.p0.p0.i64(ptr align 8 %tmp, ptr align 8 %src, i64 31, i1 false)50 %tmp_offset = getelementptr inbounds i8, ptr %tmp, i64 151 call void @llvm.memcpy.p0.p0.i64(ptr align 8 %dst, ptr align 8 %tmp_offset, i64 31, i1 false)52 53 ret void54}55 56; Dynamic sizes, so left as it is.57define void @negative_test(ptr %src, i64 %size1, i64 %size2) {58; CHECK-LABEL: @negative_test(59; CHECK-NEXT: [[TMP:%.*]] = alloca i8, i64 [[SIZE1:%.*]], align 160; CHECK-NEXT: [[DST:%.*]] = alloca i8, i64 [[SIZE2:%.*]], align 161; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[TMP]], ptr align 8 [[SRC:%.*]], i64 [[SIZE1]], i1 false)62; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[DST]], ptr align 8 [[TMP]], i64 [[SIZE2]], i1 false)63; CHECK-NEXT: ret void64;65 %tmp = alloca i8, i64 %size166 %dst = alloca i8, i64 %size267 call void @llvm.memcpy.p0.p0.i64(ptr align 8 %tmp, ptr align 8 %src, i64 %size1, i1 false)68 call void @llvm.memcpy.p0.p0.i64(ptr align 8 %dst, ptr align 8 %tmp, i64 %size2, i1 false)69 70 ret void71}72 73declare void @llvm.memcpy.p0.p0.i64(ptr, ptr, i64, i1)74