3 // RUN: split-file %s %t
5 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 %t/mod.cppm \
6 // RUN: -emit-module-interface -o %t/mod.pcm
7 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 %t/use.cpp \
8 // RUN: -fmodule-file=mod=%t/mod.pcm -emit-llvm \
9 // RUN: -o - | opt -S --passes=simplifycfg | FileCheck %t/use.cpp
15 static const Thing One;
16 explicit Thing(int raw) :raw(raw) { }
20 const Thing Thing::One = Thing(1);
25 export const C ConstantValue = {1};
27 export const C *ConstantPtr = &ConstantValue;
29 C NonConstantValue = {1};
30 export const C &ConstantRef = NonConstantValue;
32 export struct NonConstexprDtor {
33 constexpr NonConstexprDtor(int raw) : raw(raw) {}
39 export const NonConstexprDtor NonConstexprDtorValue = {1};
47 extern "C" __attribute__((noinline)) inline int unneeded() {
51 extern "C" __attribute__((noinline)) inline int needed() {
56 Thing t1 = Thing::One;
57 return consume(t1.raw);
61 if (ConstantValue.value)
62 return consumeC(ConstantValue);
67 auto Ptr = ConstantPtr;
69 return consumeC(*Ptr);
74 auto Ref = ConstantRef;
81 NonConstexprDtor V = NonConstexprDtorValue;
83 return consume(V.raw);
87 // CHECK: @_ZNW3mod5Thing3OneE = external
88 // CHECK: @_ZW3mod13ConstantValue ={{.*}}available_externally{{.*}} constant
89 // CHECK: @_ZW3mod11ConstantPtr = external
90 // CHECK: @_ZW3mod16NonConstantValue = external
91 // CHECK: @_ZW3mod21NonConstexprDtorValue = external
93 // Check that the middle end can optimize the program by the constant information.
94 // CHECK-NOT: @unneeded(
96 // Check that the use of ConstantPtr won't get optimized incorrectly.
97 // CHECK-LABEL: @_Z4use3v(
100 // Check that the use of ConstantRef won't get optimized incorrectly.
101 // CHECK-LABEL: @_Z4use4v(
104 // Check that the use of NonConstexprDtorValue won't get optimized incorrectly.
105 // CHECK-LABEL: @_Z4use5v(