diff options
author | John McCall <rjmccall@apple.com> | 2011-07-13 06:10:41 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2011-07-13 06:10:41 +0000 |
commit | f677a8e99eb93f078bfafe0792f5ae3e98885d8d (patch) | |
tree | 61e1b65bc6359e2bffd71ebe4a3c214df534e22d /clang/test/CodeGenCXX/partial-destruction.cpp | |
parent | 46ca3272e48cac7e6afbf08ee1f320723eaf7632 (diff) | |
download | bcm5719-llvm-f677a8e99eb93f078bfafe0792f5ae3e98885d8d.tar.gz bcm5719-llvm-f677a8e99eb93f078bfafe0792f5ae3e98885d8d.zip |
Convert the standard default-construction loops to use phis and
partial destruction.
llvm-svn: 135033
Diffstat (limited to 'clang/test/CodeGenCXX/partial-destruction.cpp')
-rw-r--r-- | clang/test/CodeGenCXX/partial-destruction.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/partial-destruction.cpp b/clang/test/CodeGenCXX/partial-destruction.cpp index 52995523bfb..f929d2d75e7 100644 --- a/clang/test/CodeGenCXX/partial-destruction.cpp +++ b/clang/test/CodeGenCXX/partial-destruction.cpp @@ -118,3 +118,38 @@ namespace test1 { // CHECK: invoke void @_ZN5test11AD1Ev([[A]]* [[Y]]) // CHECK: invoke void @_ZN5test11AD1Ev([[A]]* [[X]]) } + +namespace test2 { + struct A { A(); ~A(); }; + + void test() { + A v[4][7]; + + // CHECK: define void @_ZN5test24testEv() + // CHECK: [[V:%.*]] = alloca [4 x [7 x [[A:%.*]]]], align 1 + // CHECK-NEXT: alloca i8* + // CHECK-NEXT: alloca i32 + // CHECK-NEXT: alloca i32 + + // Main initialization loop. + // CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [4 x [7 x [[A]]]]* [[V]], i32 0, i32 0, i32 0 + // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 28 + // CHECK-NEXT: br label + // CHECK: [[CUR:%.*]] = phi [[A]]* [ [[BEGIN]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ] + // CHECK-NEXT: invoke void @_ZN5test21AC1Ev([[A]]* [[CUR]]) + // CHECK: [[NEXT:%.*]] = getelementptr inbounds [[A]]* [[CUR]], i64 1 + // CHECK-NEXT: [[DONE:%.*]] = icmp eq [[A]]* [[NEXT]], [[END]] + // CHECK-NEXT: br i1 [[DONE]], + + // Partial destruction landing pad. + // CHECK: llvm.eh.exception() + // CHECK: [[EMPTY:%.*]] = icmp eq [[A]]* [[BEGIN]], [[CUR]] + // CHECK-NEXT: br i1 [[EMPTY]], + // CHECK: [[PAST:%.*]] = phi [[A]]* [ [[CUR]], {{%.*}} ], [ [[DEL:%.*]], {{%.*}} ] + // CHECK-NEXT: [[DEL]] = getelementptr inbounds [[A]]* [[PAST]], i64 -1 + // CHECK-NEXT: invoke void @_ZN5test21AD1Ev([[A]]* [[DEL]]) + // CHECK: [[T0:%.*]] = icmp eq [[A]]* [[DEL]], [[BEGIN]] + // CHECK-NEXT: br i1 [[T0]], + } + +} |