1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=memcpyopt,dce -S -verify-memoryssa | FileCheck %s 3 4; Negative test 5; Check this test is not transformed into memset, or cause a compiler warning 6; 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 16 11; CHECK-NEXT: [[TMP1:%.*]] = getelementptr <vscale x 16 x i8>, ptr [[P]], i64 1 12; CHECK-NEXT: store <vscale x 16 x i8> zeroinitializer, ptr [[TMP1]], align 16 13; CHECK-NEXT: ret void 14; 15 store <vscale x 16 x i8> zeroinitializer, ptr %p 16 %tmp1 = getelementptr <vscale x 16 x i8>, ptr %p, i64 1 17 store <vscale x 16 x i8> zeroinitializer, ptr %tmp1 18 ret void 19} 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 2 26; CHECK-NEXT: ret void 27; 28entry: 29 store { <vscale x 16 x i1>, <vscale x 16 x i1> } zeroinitializer, ptr %p, align 2 30 ret void 31} 32 33; Positive test 34 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 void 39; 40 store i8 %z, ptr %p 41 %tmp1 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 1 42 store i8 %z, ptr %tmp1 43 %tmp2 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 2 44 store i8 %z, ptr %tmp2 45 %tmp3 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 3 46 store i8 %z, ptr %tmp3 47 %tmp4 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 4 48 store i8 %z, ptr %tmp4 49 %tmp5 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 5 50 store i8 %z, ptr %tmp5 51 %tmp6 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 6 52 store i8 %z, ptr %tmp6 53 %tmp7 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 7 54 store i8 %z, ptr %tmp7 55 %tmp8 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 8 56 store i8 %z, ptr %tmp8 57 %tmp9 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 9 58 store i8 %z, ptr %tmp9 59 %tmp10 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 10 60 store i8 %z, ptr %tmp10 61 %tmp11 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 11 62 store i8 %z, ptr %tmp11 63 %tmp12 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 12 64 store i8 %z, ptr %tmp12 65 %tmp13 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 13 66 store i8 %z, ptr %tmp13 67 %tmp14 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 14 68 store i8 %z, ptr %tmp14 69 %tmp15 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 15 70 store i8 %z, ptr %tmp15 71 %tmp16 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 16 72 store i8 %z, ptr %tmp16 73 ret void 74} 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 0 79; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP0]], i8 [[Z:%.*]], i64 17, i1 false) 80; CHECK-NEXT: ret void 81; 82 %tmp0 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 0 83 store i8 %z, ptr %tmp0 84 %tmp1 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 1 85 store i8 %z, ptr %tmp1 86 %tmp2 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 2 87 store i8 %z, ptr %tmp2 88 %tmp3 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 3 89 store i8 %z, ptr %tmp3 90 %tmp4 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 4 91 store i8 %z, ptr %tmp4 92 %tmp5 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 5 93 store i8 %z, ptr %tmp5 94 %tmp6 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 6 95 store i8 %z, ptr %tmp6 96 %tmp7 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 7 97 store i8 %z, ptr %tmp7 98 %tmp8 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 8 99 store i8 %z, ptr %tmp8 100 %tmp9 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 9 101 store i8 %z, ptr %tmp9 102 %tmp10 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 10 103 store i8 %z, ptr %tmp10 104 %tmp11 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 11 105 store i8 %z, ptr %tmp11 106 %tmp12 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 12 107 store i8 %z, ptr %tmp12 108 %tmp13 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 13 109 store i8 %z, ptr %tmp13 110 %tmp14 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 14 111 store i8 %z, ptr %tmp14 112 %tmp15 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 15 113 store i8 %z, ptr %tmp15 114 %tmp16 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 16 115 store i8 %z, ptr %tmp16 116 ret void 117} 118