xref: /llvm-project/clang/test/CodeGen/memcmp-inline-builtin-to-asm.c (revision c5de4dd1eab00df76c1a68c5f397304ceacb71f2)
1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
2 
3 // RUN: %clang_cc1 -triple x86_64 -emit-llvm -o - %s | opt -S -passes=verify | FileCheck %s
4 //
5 // Verifies that clang detects memcmp inline version and uses it instead of the builtin.
6 
7 typedef unsigned long size_t;
8 
9 // Clang requires these attributes for a function to be redefined.
10 #define AVAILABLE_EXTERNALLY extern inline __attribute__((always_inline)) __attribute__((gnu_inline))
11 
12 const void *con_unify_unimap_p1;
13 
14 AVAILABLE_EXTERNALLY
memcmp(const void * p,const void * q,unsigned long size)15 int memcmp(const void *p, const void *q, unsigned long size) {
16   return __builtin_memcmp(p, q, size);
17 }
18 
19 // CHECK-LABEL: @con_unify_unimap_q1(
20 // CHECK-NEXT:  entry:
21 // CHECK-NEXT:    [[P_ADDR_I:%.*]] = alloca ptr, align 8
22 // CHECK-NEXT:    [[Q_ADDR_I:%.*]] = alloca ptr, align 8
23 // CHECK-NEXT:    [[SIZE_ADDR_I:%.*]] = alloca i64, align 8
24 // CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr @con_unify_unimap_p1, align 8
25 // CHECK-NEXT:    store ptr [[TMP0]], ptr [[P_ADDR_I]], align 8
26 // CHECK-NEXT:    store ptr @con_unify_unimap_q1, ptr [[Q_ADDR_I]], align 8
27 // CHECK-NEXT:    store i64 4, ptr [[SIZE_ADDR_I]], align 8
28 // CHECK-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[P_ADDR_I]], align 8
29 // CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr [[Q_ADDR_I]], align 8
30 // CHECK-NEXT:    [[TMP3:%.*]] = load i64, ptr [[SIZE_ADDR_I]], align 8
31 // CHECK-NEXT:    [[CALL_I:%.*]] = call i32 @memcmp(ptr noundef [[TMP1]], ptr noundef [[TMP2]], i64 noundef [[TMP3]]) #[[ATTR3:[0-9]+]]
32 // CHECK-NEXT:    ret i32 [[CALL_I]]
33 //
con_unify_unimap_q1(void)34 int con_unify_unimap_q1(void) {
35   return memcmp(con_unify_unimap_p1, con_unify_unimap_q1, sizeof(int));
36 }
37