[clang] [clang] Skip auto-init on scalar vars that have a non-constant Init and no self-ref (PR #94642)

Haopeng Liu via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 13 12:47:44 PDT 2024


================
@@ -0,0 +1,110 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -emit-llvm -o - | FileCheck %s -check-prefix=UNINIT
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=pattern %s -emit-llvm -o - | FileCheck %s -check-prefix=PATTERN
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=zero %s -emit-llvm -o - | FileCheck %s -check-prefix=ZERO
+
+template<typename T> void used(T &) noexcept;
+
+extern "C" {
+
+extern int get_int(int) noexcept;
+struct C {
+  int x;
+  int y;
+};
+extern C make_c() noexcept;
+
+// Scalar with a self-reference: does need auto-init.
+// UNINIT-LABEL:  test_selfinit_call(
+// ZERO-LABEL:    test_selfinit_call(
+// ZERO: store i32 0, ptr %self, align 4, !annotation [[AUTO_INIT:!.+]]
+// PATTERN-LABEL: test_selfinit_call(
+// PATTERN: store i32 -1431655766, ptr %self, align 4, !annotation [[AUTO_INIT:!.+]]
+void test_selfinit_call() {
+  int self = get_int(self);
+  used(self);
+}
+
+// Scalar without a self-reference: no auto-init needed.
+// UNINIT-LABEL:  test_nonself_call(
+// ZERO-LABEL:    test_nonself_call(
+// ZERO-NOT: !annotation [[AUTO_INIT:!.+]]
+// PATTERN-LABEL: test_nonself_call(
+// PATTERN-NOT: !annotation [[AUTO_INIT:!.+]]
+void test_nonself_call() {
+  int x = get_int(2);
+  used(x);
+}
+
+// Scalar with a self-reference: does need auto-init.
+// UNINIT-LABEL:  test_selfinit_lambda_call(
+// ZERO-LABEL:    test_selfinit_lambda_call(
----------------
haopliu wrote:

Nit, if "UNINIT-LABEL", "ZERO-LABEL", and "PATTERN-LABEL" are always the same, just define a common label like "CHECK-LABEL:" to avoid redundancy?

https://github.com/llvm/llvm-project/pull/94642


More information about the cfe-commits mailing list