diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp --- a/clang/lib/CodeGen/CGDecl.cpp +++ b/clang/lib/CodeGen/CGDecl.cpp @@ -974,10 +974,10 @@ return nullptr; // TODO: Remove. It's here just to keep behavior. - if (MFB.Other && MFB.Value && MFB.Value != llvm::ConstantInt::get(CGM.Int8Ty, 0)) + if (MFB.Other && MFB.Value && + MFB.Value != llvm::ConstantInt::get(CGM.Int8Ty, 0)) return nullptr; - if (!MFB.Value) { // We don't know most frequent byte, we may still completely initialize it // with small number of stores. diff --git a/clang/test/CodeGen/init-memset.c b/clang/test/CodeGen/init-memset.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/init-memset.c @@ -0,0 +1,46 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -O0 -emit-llvm -o - %s | FileCheck %s + +void use(void *); + +void test_small() { + // CHECK-LABEL: define void @test_small() + int a[] = {1, 2, 3, 4}; + // CHECK: call void @llvm.memcpy.{{.*}} + use(a); +} + +void test_differen() { + // CHECK-LABEL: define void @test_differen() + int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; + // CHECK: call void @llvm.memcpy.{{.*}} + use(a); +} + +void test_all_zeros() { + // CHECK-LABEL: define void @test_all_zeros() + int a[16] = {}; + // CHECK: call void @llvm.memset.{{.*}} + use(a); +} + +void test_all_a() { + // CHECK-LABEL: define void @test_all_a() + char a[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; + // CHECK: call void @llvm.memcpy.{{.*}} + use(a); +} + +void test_most_zeros() { + // CHECK-LABEL: define void @test_most_zeros() + int a[16] = {0, 0, 1}; + // CHECK: call void @llvm.memset.{{.*}} + // CHECK: store i32 1 + use(a); +} + +void test_most_a() { + // CHECK-LABEL: define void @test_most_a() + char a[] = "aaaaazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; + // CHECK: call void @llvm.memcpy.{{.*}} + use(a); +}