1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -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(i8* %p) { 9; CHECK-LABEL: @foo( 10; CHECK-NEXT: [[A:%.*]] = bitcast i8* [[P:%.*]] to <vscale x 16 x i8>* 11; CHECK-NEXT: [[TMP0:%.*]] = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* [[A]], i64 0 12; CHECK-NEXT: store <vscale x 16 x i8> zeroinitializer, <vscale x 16 x i8>* [[TMP0]], align 16 13; CHECK-NEXT: [[TMP1:%.*]] = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* [[A]], i64 1 14; CHECK-NEXT: store <vscale x 16 x i8> zeroinitializer, <vscale x 16 x i8>* [[TMP1]], align 16 15; CHECK-NEXT: ret void 16; 17 %a = bitcast i8* %p to <vscale x 16 x i8>* 18 %tmp0 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i64 0 19 store <vscale x 16 x i8> zeroinitializer, <vscale x 16 x i8>* %tmp0 20 %tmp1 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i64 1 21 store <vscale x 16 x i8> zeroinitializer, <vscale x 16 x i8>* %tmp1 22 ret void 23} 24 25; Positive test 26 27define void @memset_vscale_index_zero(i8* %p, i8 %z) { 28; CHECK-LABEL: @memset_vscale_index_zero( 29; CHECK-NEXT: [[A:%.*]] = bitcast i8* [[P:%.*]] to <vscale x 16 x i8>* 30; CHECK-NEXT: [[TMP0:%.*]] = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* [[A]], i32 0, i32 0 31; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* align 1 [[TMP0]], i8 [[Z:%.*]], i64 17, i1 false) 32; CHECK-NEXT: ret void 33; 34 %a = bitcast i8* %p to <vscale x 16 x i8>* 35 %tmp0 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 0, i32 0 36 store i8 %z, i8* %tmp0 37 %tmp1 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 0, i32 1 38 store i8 %z, i8* %tmp1 39 %tmp2 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 0, i32 2 40 store i8 %z, i8* %tmp2 41 %tmp3 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 0, i32 3 42 store i8 %z, i8* %tmp3 43 %tmp4 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 0, i32 4 44 store i8 %z, i8* %tmp4 45 %tmp5 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 0, i32 5 46 store i8 %z, i8* %tmp5 47 %tmp6 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 0, i32 6 48 store i8 %z, i8* %tmp6 49 %tmp7 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 0, i32 7 50 store i8 %z, i8* %tmp7 51 %tmp8 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 0, i32 8 52 store i8 %z, i8* %tmp8 53 %tmp9 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 0, i32 9 54 store i8 %z, i8* %tmp9 55 %tmp10 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 0, i32 10 56 store i8 %z, i8* %tmp10 57 %tmp11 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 0, i32 11 58 store i8 %z, i8* %tmp11 59 %tmp12 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 0, i32 12 60 store i8 %z, i8* %tmp12 61 %tmp13 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 0, i32 13 62 store i8 %z, i8* %tmp13 63 %tmp14 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 0, i32 14 64 store i8 %z, i8* %tmp14 65 %tmp15 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 0, i32 15 66 store i8 %z, i8* %tmp15 67 %tmp16 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 0, i32 16 68 store i8 %z, i8* %tmp16 69 ret void 70} 71 72define void @memset_vscale_index_nonzero(i8* %p, i8 %z) { 73; CHECK-LABEL: @memset_vscale_index_nonzero( 74; CHECK-NEXT: [[A:%.*]] = bitcast i8* [[P:%.*]] to <vscale x 16 x i8>* 75; CHECK-NEXT: [[TMP0:%.*]] = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* [[A]], i32 1, i32 0 76; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* align 1 [[TMP0]], i8 [[Z:%.*]], i64 17, i1 false) 77; CHECK-NEXT: ret void 78; 79 %a = bitcast i8* %p to <vscale x 16 x i8>* 80 %tmp0 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 1, i32 0 81 store i8 %z, i8* %tmp0 82 %tmp1 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 1, i32 1 83 store i8 %z, i8* %tmp1 84 %tmp2 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 1, i32 2 85 store i8 %z, i8* %tmp2 86 %tmp3 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 1, i32 3 87 store i8 %z, i8* %tmp3 88 %tmp4 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 1, i32 4 89 store i8 %z, i8* %tmp4 90 %tmp5 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 1, i32 5 91 store i8 %z, i8* %tmp5 92 %tmp6 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 1, i32 6 93 store i8 %z, i8* %tmp6 94 %tmp7 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 1, i32 7 95 store i8 %z, i8* %tmp7 96 %tmp8 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 1, i32 8 97 store i8 %z, i8* %tmp8 98 %tmp9 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 1, i32 9 99 store i8 %z, i8* %tmp9 100 %tmp10 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 1, i32 10 101 store i8 %z, i8* %tmp10 102 %tmp11 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 1, i32 11 103 store i8 %z, i8* %tmp11 104 %tmp12 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 1, i32 12 105 store i8 %z, i8* %tmp12 106 %tmp13 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 1, i32 13 107 store i8 %z, i8* %tmp13 108 %tmp14 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 1, i32 14 109 store i8 %z, i8* %tmp14 110 %tmp15 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 1, i32 15 111 store i8 %z, i8* %tmp15 112 %tmp16 = getelementptr <vscale x 16 x i8>, <vscale x 16 x i8>* %a, i32 1, i32 16 113 store i8 %z, i8* %tmp16 114 ret void 115} 116