|
3 | 3 | // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o - \
|
4 | 4 | // RUN: | opt -S -passes=instcombine,mem2reg,simplifycfg -o %t.ll
|
5 | 5 | // RUN: FileCheck --check-prefix=LLVM --input-file=%t.ll %s
|
| 6 | +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o - \ |
| 7 | +// RUN: | opt -S -passes=instcombine,mem2reg,simplifycfg -o %t.ll |
| 8 | +// RUN: FileCheck --check-prefix=OGCG --input-file=%t.ll %s |
6 | 9 |
|
7 | 10 | typedef __SIZE_TYPE__ size_t;
|
8 | 11 | void test_memcpy_chk(void *dest, const void *src, size_t n) {
|
@@ -230,3 +233,28 @@ void test_memset_inline(void *dst, int val) {
|
230 | 233 | // LLVM: call void @llvm.memset.inline.p0.i64(ptr {{%.*}}, i8 {{%.*}}, i64 4, i1 false)
|
231 | 234 | __builtin_memset_inline(dst, val, 4);
|
232 | 235 | }
|
| 236 | + |
| 237 | +void* test_builtin_mempcpy(void *dest, void *src, size_t n) { |
| 238 | + // CIR-LABEL: test_builtin_mempcpy |
| 239 | + // CIR: [[ALLOCA:%.*]] = cir.alloca !cir.ptr<!void>, !cir.ptr<!cir.ptr<!void>>, ["__retval"] |
| 240 | + // CIR: cir.libc.memcpy [[NUM:%.*]] bytes from [[S:.*]] to [[DST:.*]] : |
| 241 | + // CIR: [[CAST2:%.*]] = cir.cast(bitcast, [[DST]] : !cir.ptr<!void>), !cir.ptr<!cir.ptr<!u8i>> |
| 242 | + // CIR: [[GEP:%.*]] = cir.ptr_stride([[CAST2]] : !cir.ptr<!cir.ptr<!u8i>>, [[NUM]] : !u64i) |
| 243 | + // CIR: [[CAST3:%.*]] = cir.cast(bitcast, [[ALLOCA]] |
| 244 | + // CIR: cir.store [[GEP]], [[CAST3:%.*]] |
| 245 | + // CIR-NEXT: [[LD:%.*]] = cir.load [[ALLOCA]] |
| 246 | + // CIR-NEXT: cir.return [[LD]] |
| 247 | + |
| 248 | + // LLVM-LABEL: test_builtin_mempcpy |
| 249 | + // LLVM: call void @llvm.memcpy.p0.p0.i64(ptr [[DST:%.*]], ptr {{%.*}}, i64 [[NUM:%.*]], i1 false) |
| 250 | + // LLVM-NEXT: [[GEP:%.*]] = getelementptr ptr, ptr [[DST]], i64 [[NUM]] |
| 251 | + // LLVM-NEXT: store ptr [[GEP]], ptr [[P:%.*]] |
| 252 | + // LLVM-NEXT: [[LD:%.*]] = load ptr, ptr [[P]] |
| 253 | + // LLVM-NEXT: ret ptr [[LD]] |
| 254 | + |
| 255 | + // OGCG-LABEL: test_builtin_mempcpy |
| 256 | + // OGCG: call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[DST:%.*]], ptr align 1 {{%.*}}, i64 [[NUM:%.*]], i1 false) |
| 257 | + // OGCG-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 [[NUM]] |
| 258 | + // OGCG-NEXT: ret ptr [[GEP]] |
| 259 | + return __builtin_mempcpy(dest, src, n); |
| 260 | +} |
0 commit comments