annotate libcxxabi/test/dynamic_cast_stress.pass.cpp @ 192:d7606dcf6fce

Added tag llvm10 for changeset 0572611fdcc8
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 14 Dec 2020 18:01:34 +0900
parents 1d019706d866
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===------------------------- dynamic_cast_stress.cpp --------------------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 // UNSUPPORTED: c++98, c++03
anatofuz
parents:
diff changeset
10
anatofuz
parents:
diff changeset
11 #include <cassert>
anatofuz
parents:
diff changeset
12 #include <tuple>
anatofuz
parents:
diff changeset
13 #include "support/timer.h"
anatofuz
parents:
diff changeset
14
anatofuz
parents:
diff changeset
15 template <std::size_t Indx, std::size_t Depth>
anatofuz
parents:
diff changeset
16 struct C
anatofuz
parents:
diff changeset
17 : public virtual C<Indx, Depth-1>,
anatofuz
parents:
diff changeset
18 public virtual C<Indx+1, Depth-1>
anatofuz
parents:
diff changeset
19 {
anatofuz
parents:
diff changeset
20 virtual ~C() {}
anatofuz
parents:
diff changeset
21 };
anatofuz
parents:
diff changeset
22
anatofuz
parents:
diff changeset
23 template <std::size_t Indx>
anatofuz
parents:
diff changeset
24 struct C<Indx, 0>
anatofuz
parents:
diff changeset
25 {
anatofuz
parents:
diff changeset
26 virtual ~C() {}
anatofuz
parents:
diff changeset
27 };
anatofuz
parents:
diff changeset
28
anatofuz
parents:
diff changeset
29 template <std::size_t Indx, std::size_t Depth>
anatofuz
parents:
diff changeset
30 struct B
anatofuz
parents:
diff changeset
31 : public virtual C<Indx, Depth-1>,
anatofuz
parents:
diff changeset
32 public virtual C<Indx+1, Depth-1>
anatofuz
parents:
diff changeset
33 {
anatofuz
parents:
diff changeset
34 };
anatofuz
parents:
diff changeset
35
anatofuz
parents:
diff changeset
36 template <class Indx, std::size_t Depth>
anatofuz
parents:
diff changeset
37 struct makeB;
anatofuz
parents:
diff changeset
38
anatofuz
parents:
diff changeset
39 template <std::size_t ...Indx, std::size_t Depth>
anatofuz
parents:
diff changeset
40 struct makeB<std::__tuple_indices<Indx...>, Depth>
anatofuz
parents:
diff changeset
41 : public B<Indx, Depth>...
anatofuz
parents:
diff changeset
42 {
anatofuz
parents:
diff changeset
43 };
anatofuz
parents:
diff changeset
44
anatofuz
parents:
diff changeset
45 template <std::size_t Width, std::size_t Depth>
anatofuz
parents:
diff changeset
46 struct A
anatofuz
parents:
diff changeset
47 : public makeB<typename std::__make_tuple_indices<Width>::type, Depth>
anatofuz
parents:
diff changeset
48 {
anatofuz
parents:
diff changeset
49 };
anatofuz
parents:
diff changeset
50
anatofuz
parents:
diff changeset
51 void test()
anatofuz
parents:
diff changeset
52 {
anatofuz
parents:
diff changeset
53 const std::size_t Width = 10;
anatofuz
parents:
diff changeset
54 const std::size_t Depth = 5;
anatofuz
parents:
diff changeset
55 A<Width, Depth> a;
anatofuz
parents:
diff changeset
56 typedef B<Width/2, Depth> Destination;
anatofuz
parents:
diff changeset
57 // typedef A<Width, Depth> Destination;
anatofuz
parents:
diff changeset
58 Destination *b = nullptr;
anatofuz
parents:
diff changeset
59 {
anatofuz
parents:
diff changeset
60 timer t;
anatofuz
parents:
diff changeset
61 b = dynamic_cast<Destination*>((C<Width/2, 0>*)&a);
anatofuz
parents:
diff changeset
62 }
anatofuz
parents:
diff changeset
63 assert(b != 0);
anatofuz
parents:
diff changeset
64 }
anatofuz
parents:
diff changeset
65
anatofuz
parents:
diff changeset
66 int main()
anatofuz
parents:
diff changeset
67 {
anatofuz
parents:
diff changeset
68 test();
anatofuz
parents:
diff changeset
69 }
anatofuz
parents:
diff changeset
70
anatofuz
parents:
diff changeset
71 /*
anatofuz
parents:
diff changeset
72 Timing results I'm seeing (median of 3 microseconds):
anatofuz
parents:
diff changeset
73
anatofuz
parents:
diff changeset
74 libc++abi gcc's dynamic_cast
anatofuz
parents:
diff changeset
75 B<Width/2, Depth> -O3 48.334 93.190 libc++abi 93% faster
anatofuz
parents:
diff changeset
76 B<Width/2, Depth> -Os 58.535 94.103 libc++abi 61% faster
anatofuz
parents:
diff changeset
77 A<Width, Depth> -O3 11.515 33.134 libc++abi 188% faster
anatofuz
parents:
diff changeset
78 A<Width, Depth> -Os 12.631 31.553 libc++abi 150% faster
anatofuz
parents:
diff changeset
79
anatofuz
parents:
diff changeset
80 */