13ecd785aff34381f3704d9cb28fe3ef85af759deMon P Wang// RUN: %clang_cc1 -triple i386-pc-linux-gnu -emit-llvm < %s| FileCheck %s
21caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar
3a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner// CHECK: @test1
43ecd785aff34381f3704d9cb28fe3ef85af759deMon P Wang// CHECK: call void @llvm.memset.p0i8.i32
53ecd785aff34381f3704d9cb28fe3ef85af759deMon P Wang// CHECK: call void @llvm.memset.p0i8.i32
63ecd785aff34381f3704d9cb28fe3ef85af759deMon P Wang// CHECK: call void @llvm.memcpy.p0i8.p0i8.i32
73ecd785aff34381f3704d9cb28fe3ef85af759deMon P Wang// CHECK: call void @llvm.memmove.p0i8.p0i8.i32
83ecd785aff34381f3704d9cb28fe3ef85af759deMon P Wang// CHECK-NOT: __builtin
93ecd785aff34381f3704d9cb28fe3ef85af759deMon P Wang// CHECK: ret
10a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattnerint test1(int argc, char **argv) {
111caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar  unsigned char a = 0x11223344;
121caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar  unsigned char b = 0x11223344;
131caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar  __builtin_bzero(&a, sizeof(a));
141caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar  __builtin_memset(&a, 0, sizeof(a));
151caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar  __builtin_memcpy(&a, &b, sizeof(a));
161caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar  __builtin_memmove(&a, &b, sizeof(a));
171caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar  return 0;
181caae959017b355e9bb61250d5a0d04edbf468b0Daniel Dunbar}
19a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner
20a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner// rdar://9289468
21a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner
22a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner// CHECK: @test2
23a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner// CHECK: call void @llvm.memcpy.p0i8.p0i8.i32
24a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattnerchar* test2(char* a, char* b) {
25a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner  return __builtin_memcpy(a, b, 4);
26a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner}
27a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner
28a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner// CHECK: @test3
29a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner// CHECK: call void @llvm.memset
30a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattnervoid test3(char *P) {
31a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner  __builtin___memset_chk(P, 42, 128, 128);
32a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner}
33a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner
34a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner// CHECK: @test4
35a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner// CHECK: call void @llvm.memcpy
36a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattnervoid test4(char *P, char *Q) {
37a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner  __builtin___memcpy_chk(P, Q, 128, 128);
38a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner}
39a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner
40a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner// CHECK: @test5
41a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner// CHECK: call void @llvm.memmove
42a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattnervoid test5(char *P, char *Q) {
43a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner  __builtin___memmove_chk(P, Q, 128, 128);
44a5e5e0f41e1dcee4603244ccea3d3956c55c23acChris Lattner}
4542f681b83378de1541919c7f72e7555e35158867Chris Lattner
4642f681b83378de1541919c7f72e7555e35158867Chris Lattner// CHECK: @test6
4742f681b83378de1541919c7f72e7555e35158867Chris Lattner// CHECK: call void @llvm.memcpy
4842f681b83378de1541919c7f72e7555e35158867Chris Lattnerint test6(char *X) {
4942f681b83378de1541919c7f72e7555e35158867Chris Lattner  return __builtin___memcpy_chk(X, X, 42, 42) != 0;
5042f681b83378de1541919c7f72e7555e35158867Chris Lattner}
51d6e73569ccf09369f9bd2021d53c88e7bded06e3Chris Lattner
52d6e73569ccf09369f9bd2021d53c88e7bded06e3Chris Lattner// CHECK: @test7
53d6e73569ccf09369f9bd2021d53c88e7bded06e3Chris Lattner// PR12094
54d6e73569ccf09369f9bd2021d53c88e7bded06e3Chris Lattnerint test7(int *p) {
555bd20ffcfefcfb2e5fd0cb1c9716cbccc4c6c3beChris Lattner  struct snd_pcm_hw_params_t* hwparams;  // incomplete type.
565bd20ffcfefcfb2e5fd0cb1c9716cbccc4c6c3beChris Lattner
57d6e73569ccf09369f9bd2021d53c88e7bded06e3Chris Lattner  // CHECK: call void @llvm.memset{{.*}}256, i32 4, i1 false)
58d6e73569ccf09369f9bd2021d53c88e7bded06e3Chris Lattner  __builtin_memset(p, 0, 256);  // Should be alignment = 4
595bd20ffcfefcfb2e5fd0cb1c9716cbccc4c6c3beChris Lattner
605bd20ffcfefcfb2e5fd0cb1c9716cbccc4c6c3beChris Lattner  // CHECK: call void @llvm.memset{{.*}}256, i32 1, i1 false)
615bd20ffcfefcfb2e5fd0cb1c9716cbccc4c6c3beChris Lattner  __builtin_memset((char*)p, 0, 256);  // Should be alignment = 1
62d6e73569ccf09369f9bd2021d53c88e7bded06e3Chris Lattner
63d6e73569ccf09369f9bd2021d53c88e7bded06e3Chris Lattner  __builtin_memset(hwparams, 0, 256);  // No crash alignment = 1
64d6e73569ccf09369f9bd2021d53c88e7bded06e3Chris Lattner  // CHECK: call void @llvm.memset{{.*}}256, i32 1, i1 false)
65d6e73569ccf09369f9bd2021d53c88e7bded06e3Chris Lattner}
66ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedman
67ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedman// <rdar://problem/11314941>
68ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedman// Make sure we don't over-estimate the alignment of fields of
69ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedman// packed structs.
70ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedmanstruct PS {
71ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedman  int modes[4];
72ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedman} __attribute__((packed));
73ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedmanstruct PS ps;
74ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedmanvoid test8(int *arg) {
75ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedman  // CHECK: @test8
76ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedman  // CHECK: call void @llvm.memcpy{{.*}} 16, i32 1, i1 false)
77ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedman  __builtin_memcpy(arg, ps.modes, sizeof(struct PS));
78ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedman}
79ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedman
80ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedman__attribute((aligned(16))) int x[4], y[4];
81ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedmanvoid test9() {
82ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedman  // CHECK: @test9
83ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedman  // CHECK: call void @llvm.memcpy{{.*}} 16, i32 16, i1 false)
84ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedman  __builtin_memcpy(x, y, sizeof(y));
85ea93e40785ffeadfac66b948c95f9490ec26207aEli Friedman}
86