118 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=memcpyopt,dce -S -verify-memoryssa | FileCheck %s3 4; Negative test5; Check this test is not transformed into memset, or cause a compiler warning6; warning: Compiler has made implicit assumption that TypeSize is not scalable. This may or may not lead to broken code.7 8define void @foo(ptr %p) {9; CHECK-LABEL: @foo(10; CHECK-NEXT: store <vscale x 16 x i8> zeroinitializer, ptr [[P:%.*]], align 1611; CHECK-NEXT: [[TMP1:%.*]] = getelementptr <vscale x 16 x i8>, ptr [[P]], i64 112; CHECK-NEXT: store <vscale x 16 x i8> zeroinitializer, ptr [[TMP1]], align 1613; CHECK-NEXT: ret void14;15 store <vscale x 16 x i8> zeroinitializer, ptr %p16 %tmp1 = getelementptr <vscale x 16 x i8>, ptr %p, i64 117 store <vscale x 16 x i8> zeroinitializer, ptr %tmp118 ret void19}20 21; Test the compiler does not crash on a store of a scalable aggregate type.22define void @test_no_crash_scalable_agg(ptr %p) {23; CHECK-LABEL: @test_no_crash_scalable_agg(24; CHECK-NEXT: entry:25; CHECK-NEXT: store { <vscale x 16 x i1>, <vscale x 16 x i1> } zeroinitializer, ptr [[P:%.*]], align 226; CHECK-NEXT: ret void27;28entry:29 store { <vscale x 16 x i1>, <vscale x 16 x i1> } zeroinitializer, ptr %p, align 230 ret void31}32 33; Positive test34 35define void @memset_vscale_index_zero(ptr %p, i8 %z) {36; CHECK-LABEL: @memset_vscale_index_zero(37; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[P:%.*]], i8 [[Z:%.*]], i64 17, i1 false)38; CHECK-NEXT: ret void39;40 store i8 %z, ptr %p41 %tmp1 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 142 store i8 %z, ptr %tmp143 %tmp2 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 244 store i8 %z, ptr %tmp245 %tmp3 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 346 store i8 %z, ptr %tmp347 %tmp4 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 448 store i8 %z, ptr %tmp449 %tmp5 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 550 store i8 %z, ptr %tmp551 %tmp6 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 652 store i8 %z, ptr %tmp653 %tmp7 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 754 store i8 %z, ptr %tmp755 %tmp8 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 856 store i8 %z, ptr %tmp857 %tmp9 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 958 store i8 %z, ptr %tmp959 %tmp10 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 1060 store i8 %z, ptr %tmp1061 %tmp11 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 1162 store i8 %z, ptr %tmp1163 %tmp12 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 1264 store i8 %z, ptr %tmp1265 %tmp13 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 1366 store i8 %z, ptr %tmp1367 %tmp14 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 1468 store i8 %z, ptr %tmp1469 %tmp15 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 1570 store i8 %z, ptr %tmp1571 %tmp16 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 1672 store i8 %z, ptr %tmp1673 ret void74}75 76define void @memset_vscale_index_nonzero(ptr %p, i8 %z) {77; CHECK-LABEL: @memset_vscale_index_nonzero(78; CHECK-NEXT: [[TMP0:%.*]] = getelementptr <vscale x 16 x i8>, ptr [[P:%.*]], i32 1, i32 079; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP0]], i8 [[Z:%.*]], i64 17, i1 false)80; CHECK-NEXT: ret void81;82 %tmp0 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 083 store i8 %z, ptr %tmp084 %tmp1 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 185 store i8 %z, ptr %tmp186 %tmp2 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 287 store i8 %z, ptr %tmp288 %tmp3 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 389 store i8 %z, ptr %tmp390 %tmp4 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 491 store i8 %z, ptr %tmp492 %tmp5 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 593 store i8 %z, ptr %tmp594 %tmp6 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 695 store i8 %z, ptr %tmp696 %tmp7 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 797 store i8 %z, ptr %tmp798 %tmp8 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 899 store i8 %z, ptr %tmp8100 %tmp9 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 9101 store i8 %z, ptr %tmp9102 %tmp10 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 10103 store i8 %z, ptr %tmp10104 %tmp11 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 11105 store i8 %z, ptr %tmp11106 %tmp12 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 12107 store i8 %z, ptr %tmp12108 %tmp13 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 13109 store i8 %z, ptr %tmp13110 %tmp14 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 14111 store i8 %z, ptr %tmp14112 %tmp15 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 15113 store i8 %z, ptr %tmp15114 %tmp16 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 16115 store i8 %z, ptr %tmp16116 ret void117}118