|
1 | | -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature |
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --force-update |
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,22 +32,25 @@ 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: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[SRC]], i64 16 |
| 35 | +; HYBRID-NEXT: [[UGLYGEP:%.*]] = 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 [[SCEVGEP]], i64 [[TMP1]], i1 false) #[[ATTR2:[0-9]+]] |
| 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]+]] |
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_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]] |
| 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]] |
51 | 54 | ; PURECAP: bb2: |
52 | 55 | ; PURECAP-NEXT: ret void |
53 | 56 | ; |
@@ -79,22 +82,25 @@ define void @must_preserve(ptr addrspace("A") noalias writeonly %dst, ptr addrsp |
79 | 82 | ; HYBRID-NEXT: [[CMP1:%.*]] = icmp sgt i64 [[COUNT]], 0 |
80 | 83 | ; HYBRID-NEXT: br i1 [[CMP1]], label [[BB1_PREHEADER:%.*]], label [[BB2:%.*]] |
81 | 84 | ; HYBRID: bb1.preheader: |
82 | | -; HYBRID-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[SRC]], i64 16 |
| 85 | +; HYBRID-NEXT: [[UGLYGEP:%.*]] = getelementptr i8, ptr [[SRC]], i64 16 |
83 | 86 | ; HYBRID-NEXT: [[TMP1:%.*]] = shl nuw i64 [[COUNT]], 4 |
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]+]] |
| 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]+]] |
85 | 88 | ; HYBRID-NEXT: br label [[BB2]] |
86 | 89 | ; HYBRID: bb2: |
87 | 90 | ; HYBRID-NEXT: ret void |
88 | 91 | ; |
89 | 92 | ; PURECAP-LABEL: define {{[^@]+}}@must_preserve |
90 | 93 | ; PURECAP-SAME: (ptr addrspace(200) noalias writeonly [[DST:%.*]], ptr addrspace(200) noalias readonly [[SRC:%.*]], i64 [[COUNT:%.*]]) local_unnamed_addr addrspace(200) #[[ATTR0]] { |
91 | 94 | ; PURECAP-NEXT: [[CMP1:%.*]] = icmp sgt i64 [[COUNT]], 0 |
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]] |
| 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]] |
98 | 104 | ; PURECAP: bb2: |
99 | 105 | ; PURECAP-NEXT: ret void |
100 | 106 | ; |
|
0 commit comments