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