1 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=pattern -ftrivial-auto-var-init-stop-after=1 %s -emit-llvm -o - | FileCheck %s -check-prefix=PATTERN-STOP-AFTER-1-SCALAR
2 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=pattern -ftrivial-auto-var-init-stop-after=2 %s -emit-llvm -o - | FileCheck %s -check-prefix=PATTERN-STOP-AFTER-2-ARRAY
3 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=pattern -ftrivial-auto-var-init-stop-after=3 %s -emit-llvm -o - | FileCheck %s -check-prefix=PATTERN-STOP-AFTER-3-VLA
4 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=pattern -ftrivial-auto-var-init-stop-after=4 %s -emit-llvm -o - | FileCheck %s -check-prefix=PATTERN-STOP-AFTER-4-POINTER
5 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=pattern -ftrivial-auto-var-init-stop-after=5 %s -emit-llvm -o - | FileCheck %s -check-prefix=PATTERN-STOP-AFTER-5-BUILTIN
6 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=zero -ftrivial-auto-var-init-stop-after=1 %s -emit-llvm -o - | FileCheck %s -check-prefix=ZERO-STOP-AFTER-1-SCALAR
7 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=zero -ftrivial-auto-var-init-stop-after=2 %s -emit-llvm -o - | FileCheck %s -check-prefix=ZERO-STOP-AFTER-2-ARRAY
8 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=zero -ftrivial-auto-var-init-stop-after=3 %s -emit-llvm -o - | FileCheck %s -check-prefix=ZERO-STOP-AFTER-3-VLA
9 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=zero -ftrivial-auto-var-init-stop-after=4 %s -emit-llvm -o - | FileCheck %s -check-prefix=ZERO-STOP-AFTER-4-POINTER
10 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=zero -ftrivial-auto-var-init-stop-after=5 %s -emit-llvm -o - | FileCheck %s -check-prefix=ZERO-STOP-AFTER-5-BUILTIN
11 
12 #define ARRLEN 10
13 
14 typedef struct {
15   int i;
16   char c;
17 } S;
18 
foo(unsigned n)19 int foo(unsigned n) {
20   // scalar variable
21   long a = 888;
22   // array
23   S arr[ARRLEN];
24   // VLA
25   S vla[n];
26   // pointer
27   void *p;
28   // builtin
29   p = __builtin_alloca(sizeof(unsigned long long) * n);
30   // PATTERN-STOP-AFTER-1-SCALAR:             store i64 -6148914691236517206, i64* %a, align 8
31   // PATTERN-STOP-AFTER-1-SCALAR-NOT:         call void @llvm.memset.p0i8.i64(i8* align 16 %0, i8 -86, i64 80, i1 false)
32   // PATTERN-STOP-AFTER-2-ARRAY:              %0 = bitcast [10 x %struct.S]* %arr to i8*
33   // PATTERN-STOP-AFTER-2-ARRAY-NEXT:         call void @llvm.memset.p0i8.i64(i8* align 16 %0, i8 -86, i64 80, i1 false)
34   // PATTERN-STOP-AFTER-2-ARRAY-NOT:          vla-init.loop:
35   // PATTERN-STOP-AFTER-3-VLA:                vla-init.loop:
36   // PATTERN-STOP-AFTER-3-VLA-NEXT:           %vla.cur = phi i8* [ %vla.begin, %vla-setup.loop ], [ %vla.next, %vla-init.loop ]
37   // PATTERN-STOP-AFTER-3-VLA-NEXT-NEXT:      call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %vla.cur, i8* align 4 bitcast ({ i32, i8, [3 x i8] }* @__const._Z3fooj.vla to i8*), i64 8, i1 false)
38   // PATTERN-STOP-AFTER-3-VLA-NOT:            store i8* inttoptr (i64 -6148914691236517206 to i8*), i8** %p, align 8
39   // PATTERN-STOP-AFTER-4-POINTER:            store i8* inttoptr (i64 -6148914691236517206 to i8*), i8** %p, align 8
40   // PATTERN-STOP-AFTER-4-POINTER-NOT:        call void @llvm.memset.p0i8.i64(i8* align 16 %6, i8 -86, i64 %mul, i1 false)
41   // PATTERN-STOP-AFTER-5-BUILTIN:            call void @llvm.memset.p0i8.i64(i8* align 16 %6, i8 -86, i64 %mul, i1 false)
42   // PATTERN-STOP-AFTER-5-BUILTIN-MESSAGES:   warning: -ftrivial-auto-var-init-stop-after=5 has been enabled to limit the number of times ftrivial-auto-var-init=pattern gets applied.
43 
44   // ZERO-STOP-AFTER-1-SCALAR:                store i64 0, i64* %a, align 8
45   // ZERO-STOP-AFTER-1-SCALAR-NOT:            call void @llvm.memset.p0i8.i64(i8* align 16 %0, i8 0, i64 80, i1 false)
46   // ZERO-STOP-AFTER-2-ARRAY:                 %0 = bitcast [10 x %struct.S]* %arr to i8*
47   // ZERO-STOP-AFTER-2-ARRAY-NEXT:            call void @llvm.memset.p0i8.i64(i8* align 16 %0, i8 0, i64 80, i1 false)
48   // ZERO-STOP-AFTER-2-ARRAY-NOT:             %call void @llvm.memset.p0i8.i64(i8* align 16 %5, i8 0, i64 %4, i1 false)
49   // ZERO-STOP-AFTER-3-VLA:                   %5 = bitcast %struct.S* %vla to i8*
50   // ZERO-STOP-AFTER-3-VLA-NEXT:              call void @llvm.memset.p0i8.i64(i8* align 16 %5, i8 0, i64 %4, i1 false)
51   // ZERO-STOP-AFTER-3-VLA-NOT:               store i8* null, i8** %p, align 8
52   // ZERO-STOP-AFTER-4-POINTER:               store i8* null, i8** %p, align 8
53   // ZERO-STOP-AFTER-4-POINTER-NOT:           call void @llvm.memset.p0i8.i64(i8* align 16 %7, i8 0, i64 %mul, i1 false)
54   // ZERO-STOP-AFTER-5-BUILTIN:               %7 = alloca i8, i64 %mul, align 16
55   // ZERO-STOP-AFTER-5-BUILTIN-NEXT:          call void @llvm.memset.p0i8.i64(i8* align 16 %7, i8 0, i64 %mul, i1 false)
56   // ZERO-STOP-AFTER-5-BUILTIN-MESSAGES:      warnings: -ftrivial-auto-var-init-stop-after=5 has been enabled to limit the number of times ftrivial-auto-var-init=zero gets applied.
57   return 0;
58 }
59