|
1 | | -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --force-update |
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature |
2 | 2 | ; Check that we retain the {must,no}_preserve_cheri_tags attribute when merging memcpy loops. |
3 | 3 | ; FIXME: this does not work as expected with addrspace(200) pointers yet since we need SCEV. |
4 | 4 | ; RUN: sed -e 's/-A200-P200-G200//g' -e 's/.p200/.p0/g' %s | \ |
@@ -32,25 +32,22 @@ define void @no_preserve(ptr addrspace("A") noalias writeonly %dst, ptr addrspac |
32 | 32 | ; HYBRID-NEXT: [[CMP1:%.*]] = icmp sgt i64 [[COUNT]], 0 |
33 | 33 | ; HYBRID-NEXT: br i1 [[CMP1]], label [[BB1_PREHEADER:%.*]], label [[BB2:%.*]] |
34 | 34 | ; HYBRID: bb1.preheader: |
35 | | -; HYBRID-NEXT: [[UGLYGEP:%.*]] = getelementptr i8, ptr [[SRC]], i64 16 |
| 35 | +; HYBRID-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[SRC]], i64 16 |
36 | 36 | ; HYBRID-NEXT: [[TMP1:%.*]] = shl nuw i64 [[COUNT]], 4 |
37 | | -; HYBRID-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[DST]], ptr align 4 [[UGLYGEP]], i64 [[TMP1]], i1 false) #[[ATTR2:[0-9]+]] |
| 37 | +; HYBRID-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[DST]], ptr align 4 [[SCEVGEP]], i64 [[TMP1]], i1 false) #[[ATTR2:[0-9]+]] |
38 | 38 | ; HYBRID-NEXT: br label [[BB2]] |
39 | 39 | ; HYBRID: bb2: |
40 | 40 | ; HYBRID-NEXT: ret void |
41 | 41 | ; |
42 | 42 | ; PURECAP-LABEL: define {{[^@]+}}@no_preserve |
43 | 43 | ; PURECAP-SAME: (ptr addrspace(200) noalias writeonly [[DST:%.*]], ptr addrspace(200) noalias readonly [[SRC:%.*]], i64 [[COUNT:%.*]]) local_unnamed_addr addrspace(200) #[[ATTR0:[0-9]+]] { |
44 | 44 | ; PURECAP-NEXT: [[CMP1:%.*]] = icmp sgt i64 [[COUNT]], 0 |
45 | | -; PURECAP-NEXT: br i1 [[CMP1]], label [[BB1:%.*]], label [[BB2:%.*]] |
46 | | -; PURECAP: bb1: |
47 | | -; PURECAP-NEXT: [[IDX:%.*]] = phi i64 [ [[ADD:%.*]], [[BB1]] ], [ 0, [[TMP0:%.*]] ] |
48 | | -; PURECAP-NEXT: [[LDST:%.*]] = getelementptr [[STRUCT_WOMBAT:%.*]], ptr addrspace(200) [[DST]], i64 [[IDX]] |
49 | | -; PURECAP-NEXT: [[ADD]] = add nuw nsw i64 [[IDX]], 1 |
50 | | -; PURECAP-NEXT: [[LSRC:%.*]] = getelementptr [[STRUCT_WOMBAT]], ptr addrspace(200) [[SRC]], i64 [[ADD]] |
51 | | -; PURECAP-NEXT: tail call void @llvm.memcpy.p200.p200.i64(ptr addrspace(200) noundef nonnull align 16 dereferenceable(16) [[LDST]], ptr addrspace(200) noundef nonnull align 4 dereferenceable(16) [[LSRC]], i64 16, i1 false) #[[ATTR2:[0-9]+]] |
52 | | -; PURECAP-NEXT: [[CMP2:%.*]] = icmp slt i64 [[ADD]], [[COUNT]] |
53 | | -; PURECAP-NEXT: br i1 [[CMP2]], label [[BB1]], label [[BB2]] |
| 45 | +; PURECAP-NEXT: br i1 [[CMP1]], label [[BB1_PREHEADER:%.*]], label [[BB2:%.*]] |
| 46 | +; PURECAP: bb1.preheader: |
| 47 | +; PURECAP-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr addrspace(200) [[SRC]], i64 16 |
| 48 | +; PURECAP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[COUNT]], 4 |
| 49 | +; PURECAP-NEXT: call void @llvm.memcpy.p200.p200.i64(ptr addrspace(200) align 16 [[DST]], ptr addrspace(200) align 4 [[SCEVGEP]], i64 [[TMP1]], i1 false) #[[ATTR2:[0-9]+]] |
| 50 | +; PURECAP-NEXT: br label [[BB2]] |
54 | 51 | ; PURECAP: bb2: |
55 | 52 | ; PURECAP-NEXT: ret void |
56 | 53 | ; |
@@ -82,25 +79,22 @@ define void @must_preserve(ptr addrspace("A") noalias writeonly %dst, ptr addrsp |
82 | 79 | ; HYBRID-NEXT: [[CMP1:%.*]] = icmp sgt i64 [[COUNT]], 0 |
83 | 80 | ; HYBRID-NEXT: br i1 [[CMP1]], label [[BB1_PREHEADER:%.*]], label [[BB2:%.*]] |
84 | 81 | ; HYBRID: bb1.preheader: |
85 | | -; HYBRID-NEXT: [[UGLYGEP:%.*]] = getelementptr i8, ptr [[SRC]], i64 16 |
| 82 | +; HYBRID-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[SRC]], i64 16 |
86 | 83 | ; HYBRID-NEXT: [[TMP1:%.*]] = shl nuw i64 [[COUNT]], 4 |
87 | | -; HYBRID-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[DST]], ptr align 4 [[UGLYGEP]], i64 [[TMP1]], i1 false) #[[ATTR3:[0-9]+]] |
| 84 | +; HYBRID-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 16 [[DST]], ptr align 4 [[SCEVGEP]], i64 [[TMP1]], i1 false) #[[ATTR3:[0-9]+]] |
88 | 85 | ; HYBRID-NEXT: br label [[BB2]] |
89 | 86 | ; HYBRID: bb2: |
90 | 87 | ; HYBRID-NEXT: ret void |
91 | 88 | ; |
92 | 89 | ; PURECAP-LABEL: define {{[^@]+}}@must_preserve |
93 | 90 | ; PURECAP-SAME: (ptr addrspace(200) noalias writeonly [[DST:%.*]], ptr addrspace(200) noalias readonly [[SRC:%.*]], i64 [[COUNT:%.*]]) local_unnamed_addr addrspace(200) #[[ATTR0]] { |
94 | 91 | ; PURECAP-NEXT: [[CMP1:%.*]] = icmp sgt i64 [[COUNT]], 0 |
95 | | -; PURECAP-NEXT: br i1 [[CMP1]], label [[BB1:%.*]], label [[BB2:%.*]] |
96 | | -; PURECAP: bb1: |
97 | | -; PURECAP-NEXT: [[IDX:%.*]] = phi i64 [ [[ADD:%.*]], [[BB1]] ], [ 0, [[TMP0:%.*]] ] |
98 | | -; PURECAP-NEXT: [[LDST:%.*]] = getelementptr [[STRUCT_WOMBAT:%.*]], ptr addrspace(200) [[DST]], i64 [[IDX]] |
99 | | -; PURECAP-NEXT: [[ADD]] = add nuw nsw i64 [[IDX]], 1 |
100 | | -; PURECAP-NEXT: [[LSRC:%.*]] = getelementptr [[STRUCT_WOMBAT]], ptr addrspace(200) [[SRC]], i64 [[ADD]] |
101 | | -; PURECAP-NEXT: tail call void @llvm.memcpy.p200.p200.i64(ptr addrspace(200) noundef nonnull align 16 dereferenceable(16) [[LDST]], ptr addrspace(200) noundef nonnull align 4 dereferenceable(16) [[LSRC]], i64 16, i1 false) #[[ATTR3:[0-9]+]] |
102 | | -; PURECAP-NEXT: [[CMP2:%.*]] = icmp slt i64 [[ADD]], [[COUNT]] |
103 | | -; PURECAP-NEXT: br i1 [[CMP2]], label [[BB1]], label [[BB2]] |
| 92 | +; PURECAP-NEXT: br i1 [[CMP1]], label [[BB1_PREHEADER:%.*]], label [[BB2:%.*]] |
| 93 | +; PURECAP: bb1.preheader: |
| 94 | +; PURECAP-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr addrspace(200) [[SRC]], i64 16 |
| 95 | +; PURECAP-NEXT: [[TMP1:%.*]] = shl nuw i64 [[COUNT]], 4 |
| 96 | +; PURECAP-NEXT: call void @llvm.memcpy.p200.p200.i64(ptr addrspace(200) align 16 [[DST]], ptr addrspace(200) align 4 [[SCEVGEP]], i64 [[TMP1]], i1 false) #[[ATTR3:[0-9]+]] |
| 97 | +; PURECAP-NEXT: br label [[BB2]] |
104 | 98 | ; PURECAP: bb2: |
105 | 99 | ; PURECAP-NEXT: ret void |
106 | 100 | ; |
@@ -136,3 +130,5 @@ attributes #2 = { must_preserve_cheri_tags } |
136 | 130 | ; CHECK: attributes #1 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) } |
137 | 131 | ; CHECK: attributes #[[ATTR2]] = { no_preserve_cheri_tags } |
138 | 132 | ; CHECK: attributes #[[ATTR3]] = { must_preserve_cheri_tags } |
| 133 | +;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: |
| 134 | +; CHECK: {{.*}} |
0 commit comments