File: auto-var-init-stop-after.cpp

package info (click to toggle)
llvm-toolchain-17 1%3A17.0.6-22
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,799,624 kB
  • sloc: cpp: 6,428,607; ansic: 1,383,196; asm: 793,408; python: 223,504; objc: 75,364; f90: 60,502; lisp: 33,869; pascal: 15,282; sh: 9,684; perl: 7,453; ml: 4,937; awk: 3,523; makefile: 2,889; javascript: 2,149; xml: 888; fortran: 619; cs: 573
file content (55 lines) | stat: -rw-r--r-- 4,772 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// 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
// 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
// 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
// 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
// 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
// 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
// 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
// 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
// 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
// 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

#define ARRLEN 10

typedef struct {
  int i;
  char c;
} S;

int foo(unsigned n) {
  // scalar variable
  long a = 888;
  // array
  S arr[ARRLEN];
  // VLA
  S vla[n];
  // pointer
  void *p;
  // builtin
  p = __builtin_alloca(sizeof(unsigned long long) * n);
  // PATTERN-STOP-AFTER-1-SCALAR:             store i64 -6148914691236517206, ptr %a, align 8
  // PATTERN-STOP-AFTER-1-SCALAR-NOT:         call void @llvm.memset.p0.i64(ptr align 16 %0, i8 -86, i64 80, i1 false)
  // PATTERN-STOP-AFTER-2-ARRAY:         call void @llvm.memset.p0.i64(ptr align 16 %arr, i8 -86, i64 80, i1 false)
  // PATTERN-STOP-AFTER-2-ARRAY-NOT:          vla-init.loop:
  // PATTERN-STOP-AFTER-3-VLA:                vla-init.loop:
  // PATTERN-STOP-AFTER-3-VLA-NEXT:           %vla.cur = phi ptr [ %vla, %vla-setup.loop ], [ %vla.next, %vla-init.loop ]
  // PATTERN-STOP-AFTER-3-VLA-NEXT-NEXT:      call void @llvm.memcpy.p0.p0.i64(ptr align 8 %vla.cur, ptr align 4 @__const._Z3fooj.vla, i64 8, i1 false)
  // PATTERN-STOP-AFTER-3-VLA-NOT:            store ptr inttoptr (i64 -6148914691236517206 to ptr), ptr %p, align 8
  // PATTERN-STOP-AFTER-4-POINTER:            store ptr inttoptr (i64 -6148914691236517206 to ptr), ptr %p, align 8
  // PATTERN-STOP-AFTER-4-POINTER-NOT:        call void @llvm.memset.p0.i64(ptr align 16 %5, i8 -86, i64 %mul, i1 false)
  // PATTERN-STOP-AFTER-5-BUILTIN:            call void @llvm.memset.p0.i64(ptr align 16 %5, i8 -86, i64 %mul, i1 false)
  // 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.

  // ZERO-STOP-AFTER-1-SCALAR:                store i64 0, ptr %a, align 8
  // ZERO-STOP-AFTER-1-SCALAR-NOT:            call void @llvm.memset.p0.i64(ptr align 16 %arr, i8 0, i64 80, i1 false)
  // ZERO-STOP-AFTER-2-ARRAY:            call void @llvm.memset.p0.i64(ptr align 16 %arr, i8 0, i64 80, i1 false)
  // ZERO-STOP-AFTER-2-ARRAY-NOT:             %call void @llvm.memset.p0.i64(ptr align 16 %3, i8 0, i64 %2, i1 false)
  // ZERO-STOP-AFTER-3-VLA:              call void @llvm.memset.p0.i64(ptr align 16 %vla, i8 0, i64 %3, i1 false)
  // ZERO-STOP-AFTER-3-VLA-NOT:               store ptr null, ptr %p, align 8
  // ZERO-STOP-AFTER-4-POINTER:               store ptr null, ptr %p, align 8
  // ZERO-STOP-AFTER-4-POINTER-NOT:           call void @llvm.memset.p0.i64(ptr align 16 %4, i8 0, i64 %mul, i1 false)
  // ZERO-STOP-AFTER-5-BUILTIN:               %5 = alloca i8, i64 %mul, align 16
  // ZERO-STOP-AFTER-5-BUILTIN-NEXT:          call void @llvm.memset.p0.i64(ptr align 16 %5, i8 0, i64 %mul, i1 false)
  // 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.
  return 0;
}