xref: /llvm-project/clang/test/CodeGenCXX/auto-var-init-max-size.cpp (revision 0cf1e662b13fb20d3897c5b9055c60b0de50beca)
1a58ad3e2SHaopeng Liu // Pattern related max size tests: 1, 1024, 4096
2a58ad3e2SHaopeng Liu // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=pattern -ftrivial-auto-var-init-max-size=1 %s -emit-llvm -o - | FileCheck -check-prefix=PATTERN-COMMON -check-prefix=PATTERN-MAX-1 %s
3a58ad3e2SHaopeng Liu // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=pattern -ftrivial-auto-var-init-max-size=1024 %s -emit-llvm -o - | FileCheck -check-prefix=PATTERN-COMMON -check-prefix=PATTERN-MAX-1024 %s
4a58ad3e2SHaopeng Liu // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=pattern -ftrivial-auto-var-init-max-size=4096 %s -emit-llvm -o - | FileCheck -check-prefix=PATTERN-COMMON -check-prefix=PATTERN-MAX-4096 %s
5a58ad3e2SHaopeng Liu //
6a58ad3e2SHaopeng Liu // Zero related max size tests: 1, 1024, 4096
7a58ad3e2SHaopeng Liu // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=zero -ftrivial-auto-var-init-max-size=1 %s -emit-llvm -o - | FileCheck -check-prefix=ZERO-COMMON -check-prefix=ZERO-MAX-1 %s
8a58ad3e2SHaopeng Liu // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=zero -ftrivial-auto-var-init-max-size=1024 %s -emit-llvm -o - | FileCheck -check-prefix=ZERO-COMMON -check-prefix=ZERO-MAX-1024 %s
9a58ad3e2SHaopeng Liu // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=zero -ftrivial-auto-var-init-max-size=4096 %s -emit-llvm -o - | FileCheck -check-prefix=ZERO-COMMON -check-prefix=ZERO-MAX-4096 %s
10a58ad3e2SHaopeng Liu 
11a58ad3e2SHaopeng Liu struct Foo {
12a58ad3e2SHaopeng Liu     int x; // we should try to make sure X is initialized.
13a58ad3e2SHaopeng Liu     char buff[1024];  // this one is fine to skip
14a58ad3e2SHaopeng Liu };
15a58ad3e2SHaopeng Liu 
foo(unsigned n)16a58ad3e2SHaopeng Liu int foo(unsigned n) {
17a58ad3e2SHaopeng Liu   bool var_size_1;
18*0cf1e662SJan Voung   long var_size_8_init = 123;
19*0cf1e662SJan Voung   long var_size_8_noinit;
20*0cf1e662SJan Voung   long var_size_8_init_later;
21a58ad3e2SHaopeng Liu   void *var_size_8p;
22a58ad3e2SHaopeng Liu   int var_size_1024[256];
23a58ad3e2SHaopeng Liu   Foo var_size_1028;
24a58ad3e2SHaopeng Liu   int var_size_4096[1024];
25a58ad3e2SHaopeng Liu   // VLA, non-constant size
26a58ad3e2SHaopeng Liu   int var_vla[n];
27a58ad3e2SHaopeng Liu   // builtin, non-constant size
28a58ad3e2SHaopeng Liu   var_size_8p = __builtin_alloca(sizeof(unsigned long long) * n);
29*0cf1e662SJan Voung   var_size_8_init_later = 456;
30*0cf1e662SJan Voung   // There are 10 variables: var_size_1, var_size_8_init, var_size_8_noinit,
31*0cf1e662SJan Voung   // var_size_8_init_later, var_size_8p, var_size_1024,
32a58ad3e2SHaopeng Liu   // var_size_1028, var_size_4096, var_vla, and a builtin anonymous var ("%5").
33*0cf1e662SJan Voung   // - Doesn't need auto-init: var_size_8_init
34a58ad3e2SHaopeng Liu   // - COMMON (auto-init regardless of the max size): "var_vla", and "%5"
35a58ad3e2SHaopeng Liu   // - Max size 1: "var_size_1"
36*0cf1e662SJan Voung   // - Max size 1024: "var_size_1", "var_size_8_noinit", "var_size_8_init_later", "var_size_8p", "var_size_1024"
37*0cf1e662SJan Voung   // - Max size 4096: "var_size_1", "var_size_8_noinit", "var_size_8_init_later", "var_size_8p", "var_size_1024",
38*0cf1e662SJan Voung   //                  "var_size_1028", "var_size_4096"
39a58ad3e2SHaopeng Liu   //
40a58ad3e2SHaopeng Liu   // PATTERN-MAX-1: store i8 -86, ptr %var_size_1, align 1, !annotation [[AUTO_INIT:!.+]]
41*0cf1e662SJan Voung   // PATTERN-MAX-1-NEXT: store i64 123, ptr %var_size_8_init, align 8
42*0cf1e662SJan Voung   // PATTERN-MAX-1-NOT: store i64 -6148914691236517206, ptr %var_size_8_noinit, align 8, !annotation [[AUTO_INIT:!.+]]
43*0cf1e662SJan Voung   // PATTERN-MAX-1-NOT: store i64 -6148914691236517206, ptr %var_size_8_init_later, align 8, !annotation [[AUTO_INIT:!.+]]
44a58ad3e2SHaopeng Liu   // PATTERN-MAX-1-NOT: store ptr inttoptr (i64 -6148914691236517206 to ptr), ptr %var_size_8p, align 8, !annotation [[AUTO_INIT:!.+]]
45a58ad3e2SHaopeng Liu   // PATTERN-MAX-1-NOT: call void @llvm.memset.p0.i64(ptr align 16 %var_size_1024, i8 -86, i64 1024, i1 false), !annotation [[AUTO_INIT:!.+]]
46a58ad3e2SHaopeng Liu   // PATTERN-MAX-1-NOT: call void @llvm.memset.p0.i64(ptr align 4 %var_size_1028, i8 -86, i64 1028, i1 false), !annotation [[AUTO_INIT:!.+]]
47a58ad3e2SHaopeng Liu   // PATTERN-MAX-1-NOT: call void @llvm.memset.p0.i64(ptr align 16 %var_size_4096, i8 -86, i64 4096, i1 false), !annotation [[AUTO_INIT:!.+]]
48a58ad3e2SHaopeng Liu 
49a58ad3e2SHaopeng Liu   // PATTERN-MAX-1024: store i8 -86, ptr %var_size_1, align 1, !annotation [[AUTO_INIT:!.+]]
50*0cf1e662SJan Voung   // PATTERN-MAX-1024-NEXT: store i64 123, ptr %var_size_8_init, align 8
51*0cf1e662SJan Voung   // PATTERN-MAX-1024: store i64 -6148914691236517206, ptr %var_size_8_noinit, align 8, !annotation [[AUTO_INIT:!.+]]
52*0cf1e662SJan Voung   // PATTERN-MAX-1024: store i64 -6148914691236517206, ptr %var_size_8_init_later, align 8, !annotation [[AUTO_INIT:!.+]]
53a58ad3e2SHaopeng Liu   // PATTERN-MAX-1024: store ptr inttoptr (i64 -6148914691236517206 to ptr), ptr %var_size_8p, align 8, !annotation [[AUTO_INIT:!.+]]
54a58ad3e2SHaopeng Liu   // PATTERN-MAX-1024: call void @llvm.memset.p0.i64(ptr align 16 %var_size_1024, i8 -86, i64 1024, i1 false), !annotation [[AUTO_INIT:!.+]]
55a58ad3e2SHaopeng Liu   // PATTERN-MAX-1024-NOT: call void @llvm.memset.p0.i64(ptr align 4 %var_size_1028, i8 -86, i64 1028, i1 false), !annotation [[AUTO_INIT:!.+]]
56a58ad3e2SHaopeng Liu   // PATTERN-MAX-1024-NOT: call void @llvm.memset.p0.i64(ptr align 16 %var_size_4096, i8 -86, i64 4096, i1 false), !annotation [[AUTO_INIT:!.+]]
57a58ad3e2SHaopeng Liu 
58a58ad3e2SHaopeng Liu   // PATTERN-MAX-4096: store i8 -86, ptr %var_size_1, align 1, !annotation [[AUTO_INIT:!.+]]
59*0cf1e662SJan Voung   // PATTERN-MAX-4096-NEXT: store i64 123, ptr %var_size_8_init, align 8
60*0cf1e662SJan Voung   // PATTERN-MAX-4096: store i64 -6148914691236517206, ptr %var_size_8_noinit, align 8, !annotation [[AUTO_INIT:!.+]]
61*0cf1e662SJan Voung   // PATTERN-MAX-4096: store i64 -6148914691236517206, ptr %var_size_8_init_later, align 8, !annotation [[AUTO_INIT:!.+]]
62a58ad3e2SHaopeng Liu   // PATTERN-MAX-4096: store ptr inttoptr (i64 -6148914691236517206 to ptr), ptr %var_size_8p, align 8, !annotation [[AUTO_INIT:!.+]]
63a58ad3e2SHaopeng Liu   // PATTERN-MAX-4096: call void @llvm.memset.p0.i64(ptr align 16 %var_size_1024, i8 -86, i64 1024, i1 false), !annotation [[AUTO_INIT:!.+]]
64a58ad3e2SHaopeng Liu   // PATTERN-MAX-4096: call void @llvm.memset.p0.i64(ptr align 4 %var_size_1028, i8 -86, i64 1028, i1 false), !annotation [[AUTO_INIT:!.+]]
65a58ad3e2SHaopeng Liu   // PATTERN-MAX-4096: call void @llvm.memset.p0.i64(ptr align 16 %var_size_4096, i8 -86, i64 4096, i1 false), !annotation [[AUTO_INIT:!.+]]
66a58ad3e2SHaopeng Liu 
67a58ad3e2SHaopeng Liu   // PATTERN-COMMON: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %vla.cur, ptr align 4 @__const._Z3fooj.var_vla, i64 4, i1 false), !annotation [[AUTO_INIT:!.+]]
68a58ad3e2SHaopeng Liu   // PATTERN-COMMON: call void @llvm.memset.p0.i64(ptr align 16 %5, i8 -86, i64 %mul, i1 false), !annotation [[AUTO_INIT:!.+]]
69a58ad3e2SHaopeng Liu 
70a58ad3e2SHaopeng Liu   // ZERO-MAX-1: store i8 0, ptr %var_size_1, align 1, !annotation [[AUTO_INIT:!.+]]
71*0cf1e662SJan Voung   // ZERO-MAX-1-NEXT: store i64 123, ptr %var_size_8_init, align 8
72*0cf1e662SJan Voung   // ZERO-MAX-1-NOT: store i64 0, ptr %var_size_8_noinit, align 8, !annotation [[AUTO_INIT:!.+]]
73*0cf1e662SJan Voung   // ZERO-MAX-1-NOT: store i64 0, ptr %var_size_8_init_later, align 8, !annotation [[AUTO_INIT:!.+]]
74a58ad3e2SHaopeng Liu   // ZERO-MAX-1-NOT: store ptr null, ptr %var_size_8p, align 8, !annotation [[AUTO_INIT:!.+]]
75a58ad3e2SHaopeng Liu   // ZERO-MAX-1-NOT: call void @llvm.memset.p0.i64(ptr align 16 %var_size_1024, i8 0, i64 1024, i1 false), !annotation [[AUTO_INIT:!.+]]
76a58ad3e2SHaopeng Liu   // ZERO-MAX-1-NOT: call void @llvm.memset.p0.i64(ptr align 4 %var_size_1028, i8 0, i64 1028, i1 false), !annotation [[AUTO_INIT:!.+]]
77a58ad3e2SHaopeng Liu   // ZERO-MAX-1-NOT: call void @llvm.memset.p0.i64(ptr align 16 %var_size_4096, i8 0, i64 4096, i1 false), !annotation [[AUTO_INIT:!.+]]
78a58ad3e2SHaopeng Liu 
79a58ad3e2SHaopeng Liu   // ZERO-MAX-1024: store i8 0, ptr %var_size_1, align 1, !annotation [[AUTO_INIT:!.+]]
80*0cf1e662SJan Voung   // ZERO-MAX-1024-NEXT: store i64 123, ptr %var_size_8_init, align 8
81*0cf1e662SJan Voung   // ZERO-MAX-1024: store i64 0, ptr %var_size_8_noinit, align 8, !annotation [[AUTO_INIT:!.+]]
82*0cf1e662SJan Voung   // ZERO-MAX-1024: store i64 0, ptr %var_size_8_init_later, align 8, !annotation [[AUTO_INIT:!.+]]
83a58ad3e2SHaopeng Liu   // ZERO-MAX-1024: store ptr null, ptr %var_size_8p, align 8, !annotation [[AUTO_INIT:!.+]]
84a58ad3e2SHaopeng Liu   // ZERO-MAX-1024: call void @llvm.memset.p0.i64(ptr align 16 %var_size_1024, i8 0, i64 1024, i1 false), !annotation [[AUTO_INIT:!.+]]
85a58ad3e2SHaopeng Liu   // ZERO-MAX-1024-NOT: call void @llvm.memset.p0.i64(ptr align 4 %var_size_1028, i8 0, i64 1028, i1 false), !annotation [[AUTO_INIT:!.+]]
86a58ad3e2SHaopeng Liu   // ZERO-MAX-1024-NOT: call void @llvm.memset.p0.i64(ptr align 16 %var_size_4096, i8 0, i64 4096, i1 false), !annotation [[AUTO_INIT:!.+]]
87a58ad3e2SHaopeng Liu 
88a58ad3e2SHaopeng Liu   // ZERO-MAX-4096: store i8 0, ptr %var_size_1, align 1, !annotation [[AUTO_INIT:!.+]]
89*0cf1e662SJan Voung   // ZERO-MAX-4096-NEXT: store i64 123, ptr %var_size_8_init, align 8
90*0cf1e662SJan Voung   // ZERO-MAX-4096: store i64 0, ptr %var_size_8_noinit, align 8, !annotation [[AUTO_INIT:!.+]]
91*0cf1e662SJan Voung   // ZERO-MAX-4096: store i64 0, ptr %var_size_8_init_later, align 8, !annotation [[AUTO_INIT:!.+]]
92a58ad3e2SHaopeng Liu   // ZERO-MAX-4096: store ptr null, ptr %var_size_8p, align 8, !annotation [[AUTO_INIT:!.+]]
93a58ad3e2SHaopeng Liu   // ZERO-MAX-4096: call void @llvm.memset.p0.i64(ptr align 16 %var_size_1024, i8 0, i64 1024, i1 false), !annotation [[AUTO_INIT:!.+]]
94a58ad3e2SHaopeng Liu   // ZERO-MAX-4096: call void @llvm.memset.p0.i64(ptr align 4 %var_size_1028, i8 0, i64 1028, i1 false), !annotation [[AUTO_INIT:!.+]]
95a58ad3e2SHaopeng Liu   // ZERO-MAX-4096: call void @llvm.memset.p0.i64(ptr align 16 %var_size_4096, i8 0, i64 4096, i1 false), !annotation [[AUTO_INIT:!.+]]
96a58ad3e2SHaopeng Liu 
97a58ad3e2SHaopeng Liu   // ZERO-COMMON: call void @llvm.memset.p0.i64(ptr align 16 %vla, i8 0, i64 %3, i1 false), !annotation [[AUTO_INIT:!.+]]
98a58ad3e2SHaopeng Liu   // ZERO-COMMON: call void @llvm.memset.p0.i64(ptr align 16 %5, i8 0, i64 %mul, i1 false), !annotation [[AUTO_INIT:!.+]]
99a58ad3e2SHaopeng Liu 
100a58ad3e2SHaopeng Liu   return 0;
101a58ad3e2SHaopeng Liu }
102