-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
P0217R3: code generation support for decomposition declarations.
llvm-svn: 278642
- llvmorg-21-init
- llvmorg-20.1.0
- llvmorg-20.1.0-rc3
- llvmorg-20.1.0-rc2
- llvmorg-20.1.0-rc1
- llvmorg-20-init
- llvmorg-19.1.7
- llvmorg-19.1.6
- llvmorg-19.1.5
- llvmorg-19.1.4
- llvmorg-19.1.3
- llvmorg-19.1.2
- llvmorg-19.1.1
- llvmorg-19.1.0
- llvmorg-19.1.0-rc4
- llvmorg-19.1.0-rc3
- llvmorg-19.1.0-rc2
- llvmorg-19.1.0-rc1
- llvmorg-19-init
- llvmorg-18.1.8
- llvmorg-18.1.7
- llvmorg-18.1.6
- llvmorg-18.1.5
- llvmorg-18.1.4
- llvmorg-18.1.3
- llvmorg-18.1.2
- llvmorg-18.1.1
- llvmorg-18.1.0
- llvmorg-18.1.0-rc4
- llvmorg-18.1.0-rc3
- llvmorg-18.1.0-rc2
- llvmorg-18.1.0-rc1
- llvmorg-18-init
- llvmorg-17.0.6
- llvmorg-17.0.5
- llvmorg-17.0.4
- llvmorg-17.0.3
- llvmorg-17.0.2
- llvmorg-17.0.1
- llvmorg-17.0.0
- llvmorg-17.0.0-rc4
- llvmorg-17.0.0-rc3
- llvmorg-17.0.0-rc2
- llvmorg-17.0.0-rc1
- llvmorg-17-init
- llvmorg-16.0.6
- llvmorg-16.0.5
- llvmorg-16.0.4
- llvmorg-16.0.3
- llvmorg-16.0.2
- llvmorg-16.0.1
- llvmorg-16.0.0
- llvmorg-16.0.0-rc4
- llvmorg-16.0.0-rc3
- llvmorg-16.0.0-rc2
- llvmorg-16.0.0-rc1
- llvmorg-16-init
- llvmorg-15.0.7
- llvmorg-15.0.6
- llvmorg-15.0.5
- llvmorg-15.0.4
- llvmorg-15.0.3
- llvmorg-15.0.2
- llvmorg-15.0.1
- llvmorg-15.0.0
- llvmorg-15.0.0-rc3
- llvmorg-15.0.0-rc2
- llvmorg-15.0.0-rc1
- llvmorg-15-init
- llvmorg-14.0.6
- llvmorg-14.0.5
- llvmorg-14.0.4
- llvmorg-14.0.3
- llvmorg-14.0.2
- llvmorg-14.0.1
- llvmorg-14.0.0
- llvmorg-14.0.0-rc4
- llvmorg-14.0.0-rc3
- llvmorg-14.0.0-rc2
- llvmorg-14.0.0-rc1
- llvmorg-14-init
- llvmorg-13.0.1
- llvmorg-13.0.1-rc3
- llvmorg-13.0.1-rc2
- llvmorg-13.0.1-rc1
- llvmorg-13.0.0
- llvmorg-13.0.0-rc4
- llvmorg-13.0.0-rc3
- llvmorg-13.0.0-rc2
- llvmorg-13.0.0-rc1
- llvmorg-13-init
- llvmorg-12.0.1
- llvmorg-12.0.1-rc4
- llvmorg-12.0.1-rc3
- llvmorg-12.0.1-rc2
- llvmorg-12.0.1-rc1
- llvmorg-12.0.0
- llvmorg-12.0.0-rc5
- llvmorg-12.0.0-rc4
- llvmorg-12.0.0-rc3
- llvmorg-12.0.0-rc2
- llvmorg-12.0.0-rc1
- llvmorg-12-init
- llvmorg-11.1.0
- llvmorg-11.1.0-rc3
- llvmorg-11.1.0-rc2
- llvmorg-11.1.0-rc1
- llvmorg-11.0.1
- llvmorg-11.0.1-rc2
- llvmorg-11.0.1-rc1
- llvmorg-11.0.0
- llvmorg-11.0.0-rc6
- llvmorg-11.0.0-rc5
- llvmorg-11.0.0-rc4
- llvmorg-11.0.0-rc3
- llvmorg-11.0.0-rc2
- llvmorg-11.0.0-rc1
- llvmorg-11-init
- llvmorg-10.0.1
- llvmorg-10.0.1-rc4
- llvmorg-10.0.1-rc3
- llvmorg-10.0.1-rc2
- llvmorg-10.0.1-rc1
- llvmorg-10.0.0
- llvmorg-10.0.0-rc6
- llvmorg-10.0.0-rc5
- llvmorg-10.0.0-rc4
- llvmorg-10.0.0-rc3
- llvmorg-10.0.0-rc2
- llvmorg-10.0.0-rc1
- llvmorg-10-init
- llvmorg-9.0.1
- llvmorg-9.0.1-rc3
- llvmorg-9.0.1-rc2
- llvmorg-9.0.1-rc1
- llvmorg-9.0.0
- llvmorg-9.0.0-rc6
- llvmorg-9.0.0-rc5
- llvmorg-9.0.0-rc4
- llvmorg-9.0.0-rc3
- llvmorg-9.0.0-rc2
- llvmorg-9.0.0-rc1
- llvmorg-8.0.1
- llvmorg-8.0.1-rc4
- llvmorg-8.0.1-rc3
- llvmorg-8.0.1-rc2
- llvmorg-8.0.1-rc1
- llvmorg-8.0.0
- llvmorg-8.0.0-rc5
- llvmorg-8.0.0-rc4
- llvmorg-8.0.0-rc3
- llvmorg-8.0.0-rc2
- llvmorg-8.0.0-rc1
- llvmorg-7.1.0
- llvmorg-7.1.0-rc1
- llvmorg-7.0.1
- llvmorg-7.0.1-rc3
- llvmorg-7.0.1-rc2
- llvmorg-7.0.1-rc1
- llvmorg-7.0.0
- llvmorg-7.0.0-rc3
- llvmorg-7.0.0-rc2
- llvmorg-7.0.0-rc1
- llvmorg-6.0.1
- llvmorg-6.0.1-rc3
- llvmorg-6.0.1-rc2
- llvmorg-6.0.1-rc1
- llvmorg-6.0.0
- llvmorg-6.0.0-rc3
- llvmorg-6.0.0-rc2
- llvmorg-6.0.0-rc1
- llvmorg-5.0.2
- llvmorg-5.0.2-rc2
- llvmorg-5.0.2-rc1
- llvmorg-5.0.1
- llvmorg-5.0.1-rc3
- llvmorg-5.0.1-rc2
- llvmorg-5.0.1-rc1
- llvmorg-5.0.0
- llvmorg-5.0.0-rc5
- llvmorg-5.0.0-rc4
- llvmorg-5.0.0-rc3
- llvmorg-5.0.0-rc2
- llvmorg-5.0.0-rc1
- llvmorg-4.0.1
- llvmorg-4.0.1-rc3
- llvmorg-4.0.1-rc2
- llvmorg-4.0.1-rc1
- llvmorg-4.0.0
- llvmorg-4.0.0-rc4
- llvmorg-4.0.0-rc3
- llvmorg-4.0.0-rc2
- llvmorg-4.0.0-rc1
Showing
9 changed files
with
178 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
// RUN: %clang_cc1 -std=c++1z -emit-llvm -o - %s | FileCheck %s | ||
|
||
namespace std { | ||
using size_t = decltype(sizeof(0)); | ||
template<typename> struct tuple_size; | ||
template<size_t, typename> struct tuple_element; | ||
} | ||
|
||
struct Y { int n; }; | ||
struct X { X(); X(Y); X(const X&); ~X(); }; | ||
|
||
struct A { int a : 13; bool b; }; | ||
|
||
struct B {}; | ||
template<> struct std::tuple_size<B> { enum { value = 2 }; }; | ||
template<> struct std::tuple_element<0,B> { using type = X; }; | ||
template<> struct std::tuple_element<1,B> { using type = const int&; }; | ||
template<int N> auto get(B) { | ||
if constexpr (N == 0) | ||
return Y(); | ||
else | ||
return 0.0; | ||
} | ||
|
||
using C = int[2]; | ||
|
||
typedef int D __attribute__((ext_vector_type(2))); | ||
|
||
using E = _Complex int; | ||
|
||
template<typename T> T &make(); | ||
|
||
// CHECK: @_ZDC2a12a2E = global {{.*}} zeroinitializer, align 4 | ||
auto [a1, a2] = make<A>(); | ||
// CHECK: @_ZDC2b12b2E = global {{.*}} zeroinitializer, align 1 | ||
// CHECK: @b1 = global {{.*}}* null, align 8 | ||
// CHECK: @_ZGR2b1_ = internal global {{.*}} zeroinitializer, align 1 | ||
// CHECK: @b2 = global i32* null, align 8 | ||
// CHECK: @_ZGR2b2_ = internal global i32 0, align 4 | ||
auto [b1, b2] = make<B>(); | ||
// CHECK: @_ZDC2c12c2E = global [2 x i32]* null, align 8 | ||
auto &[c1, c2] = make<C>(); | ||
// CHECK: @_ZDC2d12d2E = global <2 x i32> zeroinitializer, align 8 | ||
auto [d1, d2] = make<D>(); | ||
// CHECK: @_ZDC2e12e2E = global { i32, i32 } zeroinitializer, align 4 | ||
auto [e1, e2] = make<E>(); | ||
|
||
// CHECK: call {{.*}}* @_Z4makeI1AERT_v() | ||
// CHECK: call {{.*}}memcpy{{.*}}@_ZDC2a12a2E | ||
|
||
// CHECK: @_Z4makeI1BERT_v() | ||
// CHECK: call i32 @_Z3getILi0EEDa1B() | ||
// CHECK: call void @_ZN1XC1E1Y({{.*}}* @_ZGR2b1_, i32 | ||
// CHECK: call i32 @__cxa_atexit({{.*}}@_ZN1XD1Ev{{.*}}@_ZGR2b1_ | ||
// CHECK: store {{.*}}* @_ZGR2b1_, | ||
// | ||
// CHECK: call double @_Z3getILi1EEDa1B() | ||
// CHECK: fptosi double %{{.*}} to i32 | ||
// CHECK: store i32 %{{.*}}, i32* @_ZGR2b2_ | ||
// CHECK: store i32* @_ZGR2b2_, i32** @b2 | ||
|
||
// CHECK: call {{.*}}* @_Z4makeIA2_iERT_v() | ||
// CHECK: store {{.*}}, [2 x i32]** @_ZDC2c12c2E | ||
|
||
// CHECK: call {{.*}}* @_Z4makeIDv2_iERT_v() | ||
// CHECK: store {{.*}}, <2 x i32>* @_ZDC2d12d2E, align 8 | ||
|
||
// CHECK: call {{.*}}* @_Z4makeICiERT_v() | ||
// CHECK: store i32 %{{.*}}, i32* getelementptr inbounds ({ i32, i32 }, { i32, i32 }* @_ZDC2e12e2E, i32 0, i32 0) | ||
// CHECK: store i32 %{{.*}}, i32* getelementptr inbounds ({ i32, i32 }, { i32, i32 }* @_ZDC2e12e2E, i32 0, i32 1) | ||
|
||
// CHECK: define i32 @_Z12test_globalsv() | ||
int test_globals() { | ||
return a2 + b2 + c2 + d2 + e2; | ||
// CHECK: load i8, i8* getelementptr inbounds (%struct.A, %struct.A* @_ZDC2a12a2E, i32 0, i32 1) | ||
// | ||
// CHECK: %[[b2:.*]] = load i32*, i32** @b2 | ||
// CHECK: load i32, i32* %[[b2]] | ||
// | ||
// CHECK: %[[c1c2:.*]] = load [2 x i32]*, [2 x i32]** @_ZDC2c12c2E | ||
// CHECK: %[[c2:.*]] = getelementptr inbounds [2 x i32], [2 x i32]* %[[c1c2]], i64 0, i64 1 | ||
// CHECK: load i32, i32* %[[c2]] | ||
// | ||
// CHECK: %[[d1d2:.*]] = load <2 x i32>, <2 x i32>* @_ZDC2d12d2E | ||
// CHECK: extractelement <2 x i32> %[[d1d2]], i32 1 | ||
// | ||
// CHECK: load i32, i32* getelementptr inbounds ({ i32, i32 }, { i32, i32 }* @_ZDC2e12e2E, i32 0, i32 1) | ||
} | ||
|
||
// CHECK: define i32 @_Z11test_localsv() | ||
int test_locals() { | ||
auto [b1, b2] = make<B>(); | ||
|
||
// CHECK: @_Z4makeI1BERT_v() | ||
// CHECK: call i32 @_Z3getILi0EEDa1B() | ||
// CHECK: call void @_ZN1XC1E1Y({{.*}}* %[[b1:.*]], i32 | ||
// | ||
// CHECK: call double @_Z3getILi1EEDa1B() | ||
// CHECK: %[[cvt:.*]] = fptosi double %{{.*}} to i32 | ||
// CHECK: store i32 %[[cvt]], i32* %[[b2:.*]], | ||
// CHECK: store i32* %[[b2]], i32** %[[b2ref:.*]], | ||
|
||
return b2; | ||
// CHECK: %[[b2:.*]] = load i32*, i32** %[[b2ref]] | ||
// CHECK: load i32, i32* %[[b2]] | ||
|
||
// CHECK: call {{.*}}@_ZN1XD1Ev({{.*}}%[[b1]]) | ||
} | ||
|
||
// CHECK: define void @_Z13test_bitfieldR1A( | ||
void test_bitfield(A &a) { | ||
auto &[a1, a2] = a; | ||
a1 = 5; | ||
// CHECK: load i16, i16* %[[BITFIELD:.*]], | ||
// CHECK: and i16 %{{.*}}, -8192 | ||
// CHECK: or i16 %{{.*}}, 5 | ||
// CHECK: store i16 %{{.*}}, i16* %[[BITFIELD]], | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -38,4 +38,3 @@ constexpr bool g(S &&s) { | |
static_assert(g({1, 2})); | ||
|
||
// FIXME: by-value array copies | ||
// FIXME: code generation |