blob: 0f78fb0deb60aadbebfe47968782f7708aacecc5 [file] [log] [blame]
Mike Stump39f36e32009-11-16 23:36:30 +00001// RUN: clang-cc -I%S -triple x86_64-apple-darwin -std=c++0x -emit-llvm %s -o %t.ll
2// RUN: FileCheck -check-prefix LL --input-file=%t.ll %s
3
4#include <typeinfo>
5
6class test1_A { virtual void f() { } };
7class test1_B { virtual void g() { } };
8class test1_D : public virtual test1_A, private test1_B {};
9class test1_E : public test1_D, public test1_B {};
10class test1_F : public test1_E, public test1_D {};
11
12extern test1_D test1_d;
13extern test1_F test1_f;
14
15extern "C" int printf(const char *str...);
16
17#define S(V, N) if (V) printf("PASS: %d\n", N); else printf("FAIL: %d\n", N)
18
19void test1() {
20 test1_B* bp = (test1_B*)&test1_d;
21 test1_A* ap = &test1_d;
22 // This throws
23 // test1_D& dr = dynamic_cast<D&>(*bp);
24 test1_D* dp = dynamic_cast<test1_D*>(bp);
25 S(dp == 0, 1);
26 ap = dynamic_cast<test1_A*>(bp);
27 S(ap == 0, 2);
28 bp = dynamic_cast<test1_B*>(ap);
29 S(bp == 0, 3);
30 ap = dynamic_cast<test1_A*>(&test1_d);
31 S(ap != 0, 4);
Mike Stumpc888f482009-11-17 00:30:31 +000032 // FIXME: Doesn't work yet, gcc fails this at compile time. We'd need access
33 // control for this to work.
Mike Stump39f36e32009-11-16 23:36:30 +000034 // bp = dynamic_cast<test1_B*>(&test1_d);
35 // S(bp == 0, 5);
36 {
37 test1_A* ap = &test1_f;
38 S(ap != 0, 6);
39 test1_D* dp = dynamic_cast<test1_D*>(ap);
40 S(dp == 0, 7);
41 // cast from virtual base
42 test1_E* ep1 = dynamic_cast<test1_E*>(ap);
43 S(ep1 != 0, 8);
44 }
45 dp = dynamic_cast<test1_D*>(&test1_d);
46 S(dp == &test1_d, 9);
47 const test1_D *cdp = dynamic_cast<const test1_D*>(&test1_d);
48 S(cdp == &test1_d, 10);
49 dp = dynamic_cast<test1_D*>((test1_A*)0);
50 S(dp == 0, 11);
51 ap = dynamic_cast<test1_A*>(&test1_d);
52 S(ap == (test1_A*)&test1_d, 12);
53 test1_E* ep = dynamic_cast<test1_E*>(&test1_f);
54 S(ep == (test1_E*)&test1_f, 13);
55 void *vp = dynamic_cast<void*>(ap);
56 S(vp == &test1_d, 14);
57 const void *cvp = dynamic_cast<const void*>(ap);
58 S(cvp == &test1_d, 15);
59}
60
61// CHECK-LL: define void @_Z5test1v() nounwind {
62// CHECK-LL-NEXT:entry:
Mike Stumpf4a08d02009-11-17 00:14:04 +000063// CHECK-LL-NEXT: %bp = alloca %class.test1_A*, align 8
64// CHECK-LL-NEXT: %ap = alloca %class.test1_A*, align 8
65// CHECK-LL-NEXT: %dp = alloca %class.test1_D*, align 8
66// CHECK-LL-NEXT: %ap37 = alloca %class.test1_A*, align 8
67// CHECK-LL-NEXT: %dp53 = alloca %class.test1_D*, align 8
Mike Stump39f36e32009-11-16 23:36:30 +000068// CHECK-LL-NEXT: %ep1 = alloca %class.test1_E*, align 8
69// CHECK-LL-NEXT: %cdp = alloca %class.test1_D*, align 8
Mike Stumpf4a08d02009-11-17 00:14:04 +000070// CHECK-LL-NEXT: %ep = alloca %class.test1_E*, align 8
71// CHECK-LL-NEXT: %vp = alloca i8*, align 8
72// CHECK-LL-NEXT: %cvp = alloca i8*, align 8
Mike Stump39f36e32009-11-16 23:36:30 +000073// CHECK-LL-NEXT: br i1 false, label %cast.null, label %cast.notnull
Mike Stumpf4a08d02009-11-17 00:14:04 +000074// CHECK-LL: cast.notnull:
Mike Stump39f36e32009-11-16 23:36:30 +000075// CHECK-LL-NEXT: br label %cast.end
Mike Stumpf4a08d02009-11-17 00:14:04 +000076// CHECK-LL: cast.null:
Mike Stump39f36e32009-11-16 23:36:30 +000077// CHECK-LL-NEXT: br label %cast.end
Mike Stumpf4a08d02009-11-17 00:14:04 +000078// CHECK-LL: cast.end:
79// CHECK-LL-NEXT: %0 = phi %class.test1_A* [ bitcast (%class.test1_D* @test1_d to %class.test1_A*), %cast.notnull ], [ null, %cast.null ]
Mike Stump39f36e32009-11-16 23:36:30 +000080// CHECK-LL-NEXT: store %class.test1_A* %0, %class.test1_A** %bp
81// CHECK-LL-NEXT: br i1 false, label %cast.null2, label %cast.notnull1
Mike Stumpf4a08d02009-11-17 00:14:04 +000082// CHECK-LL: cast.notnull1:
83// CHECK-LL-NEXT: %vtable = load i8** bitcast (%class.test1_D* @test1_d to i8**)
84// CHECK-LL-NEXT: %vbase.offset.ptr = getelementptr i8* %vtable, i64 -24
85// CHECK-LL-NEXT: %1 = bitcast i8* %vbase.offset.ptr to i64*
86// CHECK-LL-NEXT: %vbase.offset = load i64* %1
87// CHECK-LL-NEXT: %add.ptr = getelementptr i8* getelementptr inbounds (%class.test1_D* @test1_d, i32 0, i32 0, i32 0), i64 %vbase.offset
88// CHECK-LL-NEXT: %2 = bitcast i8* %add.ptr to %class.test1_A*
Mike Stump39f36e32009-11-16 23:36:30 +000089// CHECK-LL-NEXT: br label %cast.end3
Mike Stumpf4a08d02009-11-17 00:14:04 +000090// CHECK-LL: cast.null2:
Mike Stump39f36e32009-11-16 23:36:30 +000091// CHECK-LL-NEXT: br label %cast.end3
Mike Stumpf4a08d02009-11-17 00:14:04 +000092// CHECK-LL: cast.end3:
93// CHECK-LL-NEXT: %3 = phi %class.test1_A* [ %2, %cast.notnull1 ], [ null, %cast.null2 ]
Mike Stump39f36e32009-11-16 23:36:30 +000094// CHECK-LL-NEXT: store %class.test1_A* %3, %class.test1_A** %ap
Mike Stumpf4a08d02009-11-17 00:14:04 +000095// CHECK-LL-NEXT: %tmp = load %class.test1_A** %bp
96// CHECK-LL-NEXT: %4 = icmp ne %class.test1_A* %tmp, null
Mike Stump39f36e32009-11-16 23:36:30 +000097// CHECK-LL-NEXT: br i1 %4, label %5, label %9
Mike Stumpf4a08d02009-11-17 00:14:04 +000098// CHECK-LL: ; <label>:5
99// CHECK-LL-NEXT: %6 = bitcast %class.test1_A* %tmp to i8*
Mike Stumpa84b4042009-11-20 00:02:19 +0000100// CHECK-LL-NEXT: %7 = call i8* @__dynamic_cast(i8* %6, i8* bitcast ({{.*}} @_ZTI7test1_B to i8*), i8* bitcast (i8** @_ZTI7test1_D to i8*), i64 -1)
Mike Stump39f36e32009-11-16 23:36:30 +0000101// CHECK-LL-NEXT: %8 = bitcast i8* %7 to %class.test1_D*
102// CHECK-LL-NEXT: br label %10
Mike Stumpf4a08d02009-11-17 00:14:04 +0000103// CHECK-LL: ; <label>:9
Mike Stump39f36e32009-11-16 23:36:30 +0000104// CHECK-LL-NEXT: br label %10
Mike Stumpf4a08d02009-11-17 00:14:04 +0000105// CHECK-LL: ; <label>:10
106// CHECK-LL-NEXT: %11 = phi %class.test1_D* [ %8, %5 ], [ null, %9 ]
Mike Stump39f36e32009-11-16 23:36:30 +0000107// CHECK-LL-NEXT: store %class.test1_D* %11, %class.test1_D** %dp
Mike Stumpf4a08d02009-11-17 00:14:04 +0000108// CHECK-LL-NEXT: %tmp4 = load %class.test1_D** %dp
109// CHECK-LL-NEXT: %cmp = icmp eq %class.test1_D* %tmp4, null
Mike Stump39f36e32009-11-16 23:36:30 +0000110// CHECK-LL-NEXT: br i1 %cmp, label %if.then, label %if.else
Mike Stumpf4a08d02009-11-17 00:14:04 +0000111// CHECK-LL: if.then:
112// CHECK-LL-NEXT: %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 1)
Mike Stump39f36e32009-11-16 23:36:30 +0000113// CHECK-LL-NEXT: br label %if.end
Mike Stumpf4a08d02009-11-17 00:14:04 +0000114// CHECK-LL: if.else:
115// CHECK-LL-NEXT: %call5 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 1)
Mike Stump39f36e32009-11-16 23:36:30 +0000116// CHECK-LL-NEXT: br label %if.end
Mike Stumpf4a08d02009-11-17 00:14:04 +0000117// CHECK-LL: if.end:
118// CHECK-LL-NEXT: %tmp6 = load %class.test1_A** %bp
119// CHECK-LL-NEXT: %12 = icmp ne %class.test1_A* %tmp6, null
Mike Stump39f36e32009-11-16 23:36:30 +0000120// CHECK-LL-NEXT: br i1 %12, label %13, label %17
Mike Stumpf4a08d02009-11-17 00:14:04 +0000121// CHECK-LL: ; <label>:13
122// CHECK-LL-NEXT: %14 = bitcast %class.test1_A* %tmp6 to i8*
Mike Stumpa84b4042009-11-20 00:02:19 +0000123// CHECK-LL-NEXT: %15 = call i8* @__dynamic_cast(i8* %14, i8* bitcast ({{.*}} @_ZTI7test1_B to i8*), i8* bitcast ({{.*}} @_ZTI7test1_A to i8*), i64 -1)
Mike Stumpf4a08d02009-11-17 00:14:04 +0000124// CHECK-LL-NEXT: %16 = bitcast i8* %15 to %class.test1_A*
Mike Stump39f36e32009-11-16 23:36:30 +0000125// CHECK-LL-NEXT: br label %18
Mike Stumpf4a08d02009-11-17 00:14:04 +0000126// CHECK-LL: ; <label>:17
Mike Stump39f36e32009-11-16 23:36:30 +0000127// CHECK-LL-NEXT: br label %18
Mike Stumpf4a08d02009-11-17 00:14:04 +0000128// CHECK-LL: ; <label>:18
129// CHECK-LL-NEXT: %19 = phi %class.test1_A* [ %16, %13 ], [ null, %17 ]
Mike Stump39f36e32009-11-16 23:36:30 +0000130// CHECK-LL-NEXT: store %class.test1_A* %19, %class.test1_A** %ap
Mike Stumpf4a08d02009-11-17 00:14:04 +0000131// CHECK-LL-NEXT: %tmp7 = load %class.test1_A** %ap
132// CHECK-LL-NEXT: %cmp8 = icmp eq %class.test1_A* %tmp7, null
Mike Stump39f36e32009-11-16 23:36:30 +0000133// CHECK-LL-NEXT: br i1 %cmp8, label %if.then9, label %if.else11
Mike Stumpf4a08d02009-11-17 00:14:04 +0000134// CHECK-LL: if.then9:
135// CHECK-LL-NEXT: %call10 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 2)
Mike Stump39f36e32009-11-16 23:36:30 +0000136// CHECK-LL-NEXT: br label %if.end13
Mike Stumpf4a08d02009-11-17 00:14:04 +0000137// CHECK-LL: if.else11:
138// CHECK-LL-NEXT: %call12 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 2)
Mike Stump39f36e32009-11-16 23:36:30 +0000139// CHECK-LL-NEXT: br label %if.end13
Mike Stumpf4a08d02009-11-17 00:14:04 +0000140// CHECK-LL: if.end13:
141// CHECK-LL-NEXT: %tmp14 = load %class.test1_A** %ap
142// CHECK-LL-NEXT: %20 = icmp ne %class.test1_A* %tmp14, null
Mike Stump39f36e32009-11-16 23:36:30 +0000143// CHECK-LL-NEXT: br i1 %20, label %21, label %25
Mike Stumpf4a08d02009-11-17 00:14:04 +0000144// CHECK-LL: ; <label>:21
145// CHECK-LL-NEXT: %22 = bitcast %class.test1_A* %tmp14 to i8*
Mike Stumpa84b4042009-11-20 00:02:19 +0000146// CHECK-LL-NEXT: %23 = call i8* @__dynamic_cast({{.*}} %22, i8* bitcast ({{.*}} @_ZTI7test1_A to i8*), i8* bitcast ({{.*}} @_ZTI7test1_B to i8*), i64 -1)
Mike Stumpf4a08d02009-11-17 00:14:04 +0000147// CHECK-LL-NEXT: %24 = bitcast i8* %23 to %class.test1_A*
Mike Stump39f36e32009-11-16 23:36:30 +0000148// CHECK-LL-NEXT: br label %26
Mike Stumpf4a08d02009-11-17 00:14:04 +0000149// CHECK-LL: ; <label>:25
Mike Stump39f36e32009-11-16 23:36:30 +0000150// CHECK-LL-NEXT: br label %26
Mike Stumpf4a08d02009-11-17 00:14:04 +0000151// CHECK-LL: ; <label>:26
152// CHECK-LL-NEXT: %27 = phi %class.test1_A* [ %24, %21 ], [ null, %25 ]
Mike Stump39f36e32009-11-16 23:36:30 +0000153// CHECK-LL-NEXT: store %class.test1_A* %27, %class.test1_A** %bp
Mike Stumpf4a08d02009-11-17 00:14:04 +0000154// CHECK-LL-NEXT: %tmp15 = load %class.test1_A** %bp
155// CHECK-LL-NEXT: %cmp16 = icmp eq %class.test1_A* %tmp15, null
Mike Stump39f36e32009-11-16 23:36:30 +0000156// CHECK-LL-NEXT: br i1 %cmp16, label %if.then17, label %if.else19
Mike Stumpf4a08d02009-11-17 00:14:04 +0000157// CHECK-LL: if.then17:
158// CHECK-LL-NEXT: %call18 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 3)
Mike Stump39f36e32009-11-16 23:36:30 +0000159// CHECK-LL-NEXT: br label %if.end21
Mike Stumpf4a08d02009-11-17 00:14:04 +0000160// CHECK-LL: if.else19:
161// CHECK-LL-NEXT: %call20 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 3)
Mike Stump39f36e32009-11-16 23:36:30 +0000162// CHECK-LL-NEXT: br label %if.end21
Mike Stumpf4a08d02009-11-17 00:14:04 +0000163// CHECK-LL: if.end21:
Mike Stump39f36e32009-11-16 23:36:30 +0000164// CHECK-LL-NEXT: br i1 false, label %cast.null27, label %cast.notnull22
Mike Stumpf4a08d02009-11-17 00:14:04 +0000165// CHECK-LL: cast.notnull22:
166// CHECK-LL-NEXT: %vtable23 = load i8** bitcast (%class.test1_D* @test1_d to i8**)
167// CHECK-LL-NEXT: %vbase.offset.ptr24 = getelementptr i8* %vtable23, i64 -24
168// CHECK-LL-NEXT: %28 = bitcast i8* %vbase.offset.ptr24 to i64*
169// CHECK-LL-NEXT: %vbase.offset25 = load i64* %28
170// CHECK-LL-NEXT: %add.ptr26 = getelementptr i8* getelementptr inbounds (%class.test1_D* @test1_d, i32 0, i32 0, i32 0), i64 %vbase.offset25
171// CHECK-LL-NEXT: %29 = bitcast i8* %add.ptr26 to %class.test1_A*
Mike Stump39f36e32009-11-16 23:36:30 +0000172// CHECK-LL-NEXT: br label %cast.end28
Mike Stumpf4a08d02009-11-17 00:14:04 +0000173// CHECK-LL: cast.null27:
Mike Stump39f36e32009-11-16 23:36:30 +0000174// CHECK-LL-NEXT: br label %cast.end28
Mike Stumpf4a08d02009-11-17 00:14:04 +0000175// CHECK-LL: cast.end28:
176// CHECK-LL-NEXT: %30 = phi %class.test1_A* [ %29, %cast.notnull22 ], [ null, %cast.null27 ]
Mike Stump39f36e32009-11-16 23:36:30 +0000177// CHECK-LL-NEXT: store %class.test1_A* %30, %class.test1_A** %ap
Mike Stumpf4a08d02009-11-17 00:14:04 +0000178// CHECK-LL-NEXT: %tmp29 = load %class.test1_A** %ap
179// CHECK-LL-NEXT: %cmp30 = icmp ne %class.test1_A* %tmp29, null
Mike Stump39f36e32009-11-16 23:36:30 +0000180// CHECK-LL-NEXT: br i1 %cmp30, label %if.then31, label %if.else33
Mike Stumpf4a08d02009-11-17 00:14:04 +0000181// CHECK-LL: if.then31:
182// CHECK-LL-NEXT: %call32 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 4)
Mike Stump39f36e32009-11-16 23:36:30 +0000183// CHECK-LL-NEXT: br label %if.end35
Mike Stumpf4a08d02009-11-17 00:14:04 +0000184// CHECK-LL: if.else33:
185// CHECK-LL-NEXT: %call34 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 4)
Mike Stump39f36e32009-11-16 23:36:30 +0000186// CHECK-LL-NEXT: br label %if.end35
Mike Stumpf4a08d02009-11-17 00:14:04 +0000187// CHECK-LL: if.end35:
Mike Stump39f36e32009-11-16 23:36:30 +0000188// CHECK-LL-NEXT: br i1 false, label %cast.null43, label %cast.notnull38
Mike Stumpf4a08d02009-11-17 00:14:04 +0000189// CHECK-LL: cast.notnull38:
190// CHECK-LL-NEXT: %vtable39 = load i8** bitcast (%class.test1_F* @test1_f to i8**)
191// CHECK-LL-NEXT: %vbase.offset.ptr40 = getelementptr i8* %vtable39, i64 -24
192// CHECK-LL-NEXT: %31 = bitcast i8* %vbase.offset.ptr40 to i64*
193// CHECK-LL-NEXT: %vbase.offset41 = load i64* %31
194// CHECK-LL-NEXT: %add.ptr42 = getelementptr i8* getelementptr inbounds (%class.test1_F* @test1_f, i32 0, i32 0, i32 0), i64 %vbase.offset41
195// CHECK-LL-NEXT: %32 = bitcast i8* %add.ptr42 to %class.test1_A*
Mike Stump39f36e32009-11-16 23:36:30 +0000196// CHECK-LL-NEXT: br label %cast.end44
Mike Stumpf4a08d02009-11-17 00:14:04 +0000197// CHECK-LL: cast.null43:
Mike Stump39f36e32009-11-16 23:36:30 +0000198// CHECK-LL-NEXT: br label %cast.end44
Mike Stumpf4a08d02009-11-17 00:14:04 +0000199// CHECK-LL: cast.end44:
200// CHECK-LL-NEXT: %33 = phi %class.test1_A* [ %32, %cast.notnull38 ], [ null, %cast.null43 ]
Mike Stump39f36e32009-11-16 23:36:30 +0000201// CHECK-LL-NEXT: store %class.test1_A* %33, %class.test1_A** %ap37
Mike Stumpf4a08d02009-11-17 00:14:04 +0000202// CHECK-LL-NEXT: %tmp45 = load %class.test1_A** %ap37
203// CHECK-LL-NEXT: %cmp46 = icmp ne %class.test1_A* %tmp45, null
Mike Stump39f36e32009-11-16 23:36:30 +0000204// CHECK-LL-NEXT: br i1 %cmp46, label %if.then47, label %if.else49
Mike Stumpf4a08d02009-11-17 00:14:04 +0000205// CHECK-LL: if.then47:
206// CHECK-LL-NEXT: %call48 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 6)
Mike Stump39f36e32009-11-16 23:36:30 +0000207// CHECK-LL-NEXT: br label %if.end51
Mike Stumpf4a08d02009-11-17 00:14:04 +0000208// CHECK-LL: if.else49:
209// CHECK-LL-NEXT: %call50 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 6)
Mike Stump39f36e32009-11-16 23:36:30 +0000210// CHECK-LL-NEXT: br label %if.end51
Mike Stumpf4a08d02009-11-17 00:14:04 +0000211// CHECK-LL: if.end51:
212// CHECK-LL-NEXT: %tmp54 = load %class.test1_A** %ap37
213// CHECK-LL-NEXT: %34 = icmp ne %class.test1_A* %tmp54, null
Mike Stump39f36e32009-11-16 23:36:30 +0000214// CHECK-LL-NEXT: br i1 %34, label %35, label %39
Mike Stumpf4a08d02009-11-17 00:14:04 +0000215// CHECK-LL: ; <label>:35
216// CHECK-LL-NEXT: %36 = bitcast %class.test1_A* %tmp54 to i8*
Mike Stumpa84b4042009-11-20 00:02:19 +0000217// CHECK-LL-NEXT: %37 = call i8* @__dynamic_cast(i8* %36, i8* bitcast ({{.*}} @_ZTI7test1_A to i8*), i8* bitcast ({{.*}} @_ZTI7test1_D to i8*), i64 -1)
Mike Stumpf4a08d02009-11-17 00:14:04 +0000218// CHECK-LL-NEXT: %38 = bitcast i8* %37 to %class.test1_D*
Mike Stump39f36e32009-11-16 23:36:30 +0000219// CHECK-LL-NEXT: br label %40
Mike Stumpf4a08d02009-11-17 00:14:04 +0000220// CHECK-LL: ; <label>:39
Mike Stump39f36e32009-11-16 23:36:30 +0000221// CHECK-LL-NEXT: br label %40
Mike Stumpf4a08d02009-11-17 00:14:04 +0000222// CHECK-LL: ; <label>:40
223// CHECK-LL-NEXT: %41 = phi %class.test1_D* [ %38, %35 ], [ null, %39 ]
Mike Stump39f36e32009-11-16 23:36:30 +0000224// CHECK-LL-NEXT: store %class.test1_D* %41, %class.test1_D** %dp53
Mike Stumpf4a08d02009-11-17 00:14:04 +0000225// CHECK-LL-NEXT: %tmp55 = load %class.test1_D** %dp53
226// CHECK-LL-NEXT: %cmp56 = icmp eq %class.test1_D* %tmp55, null
Mike Stump39f36e32009-11-16 23:36:30 +0000227// CHECK-LL-NEXT: br i1 %cmp56, label %if.then57, label %if.else59
Mike Stumpf4a08d02009-11-17 00:14:04 +0000228// CHECK-LL: if.then57:
229// CHECK-LL-NEXT: %call58 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 7)
Mike Stump39f36e32009-11-16 23:36:30 +0000230// CHECK-LL-NEXT: br label %if.end61
Mike Stumpf4a08d02009-11-17 00:14:04 +0000231// CHECK-LL: if.else59:
232// CHECK-LL-NEXT: %call60 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 7)
Mike Stump39f36e32009-11-16 23:36:30 +0000233// CHECK-LL-NEXT: br label %if.end61
Mike Stumpf4a08d02009-11-17 00:14:04 +0000234// CHECK-LL: if.end61:
235// CHECK-LL-NEXT: %tmp63 = load %class.test1_A** %ap37
236// CHECK-LL-NEXT: %42 = icmp ne %class.test1_A* %tmp63, null
Mike Stump39f36e32009-11-16 23:36:30 +0000237// CHECK-LL-NEXT: br i1 %42, label %43, label %47
Mike Stumpf4a08d02009-11-17 00:14:04 +0000238// CHECK-LL: ; <label>:43
239// CHECK-LL-NEXT: %44 = bitcast %class.test1_A* %tmp63 to i8*
Mike Stumpa84b4042009-11-20 00:02:19 +0000240// CHECK-LL-NEXT: %45 = call i8* @__dynamic_cast(i8* %44, i8* bitcast ({{.*}} @_ZTI7test1_A to i8*), i8* bitcast ({{.*}} @_ZTI7test1_E to i8*), i64 -1)
Mike Stumpf4a08d02009-11-17 00:14:04 +0000241// CHECK-LL-NEXT: %46 = bitcast i8* %45 to %class.test1_E*
Mike Stump39f36e32009-11-16 23:36:30 +0000242// CHECK-LL-NEXT: br label %48
Mike Stumpf4a08d02009-11-17 00:14:04 +0000243// CHECK-LL: ; <label>:47
Mike Stump39f36e32009-11-16 23:36:30 +0000244// CHECK-LL-NEXT: br label %48
Mike Stumpf4a08d02009-11-17 00:14:04 +0000245// CHECK-LL: ; <label>:48
246// CHECK-LL-NEXT: %49 = phi %class.test1_E* [ %46, %43 ], [ null, %47 ]
Mike Stump39f36e32009-11-16 23:36:30 +0000247// CHECK-LL-NEXT: store %class.test1_E* %49, %class.test1_E** %ep1
Mike Stumpf4a08d02009-11-17 00:14:04 +0000248// CHECK-LL-NEXT: %tmp64 = load %class.test1_E** %ep1
249// CHECK-LL-NEXT: %cmp65 = icmp ne %class.test1_E* %tmp64, null
Mike Stump39f36e32009-11-16 23:36:30 +0000250// CHECK-LL-NEXT: br i1 %cmp65, label %if.then66, label %if.else68
Mike Stumpf4a08d02009-11-17 00:14:04 +0000251// CHECK-LL: if.then66:
252// CHECK-LL-NEXT: %call67 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 8)
Mike Stump39f36e32009-11-16 23:36:30 +0000253// CHECK-LL-NEXT: br label %if.end70
Mike Stumpf4a08d02009-11-17 00:14:04 +0000254// CHECK-LL: if.else68:
255// CHECK-LL-NEXT: %call69 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 8)
Mike Stump39f36e32009-11-16 23:36:30 +0000256// CHECK-LL-NEXT: br label %if.end70
Mike Stumpf4a08d02009-11-17 00:14:04 +0000257// CHECK-LL: if.end70:
Mike Stump39f36e32009-11-16 23:36:30 +0000258// CHECK-LL-NEXT: store %class.test1_D* @test1_d, %class.test1_D** %dp
Mike Stumpf4a08d02009-11-17 00:14:04 +0000259// CHECK-LL-NEXT: %tmp71 = load %class.test1_D** %dp
260// CHECK-LL-NEXT: %cmp72 = icmp eq %class.test1_D* %tmp71, @test1_d
Mike Stump39f36e32009-11-16 23:36:30 +0000261// CHECK-LL-NEXT: br i1 %cmp72, label %if.then73, label %if.else75
Mike Stumpf4a08d02009-11-17 00:14:04 +0000262// CHECK-LL: if.then73:
263// CHECK-LL-NEXT: %call74 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 9)
Mike Stump39f36e32009-11-16 23:36:30 +0000264// CHECK-LL-NEXT: br label %if.end77
Mike Stumpf4a08d02009-11-17 00:14:04 +0000265// CHECK-LL: if.else75:
266// CHECK-LL-NEXT: %call76 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 9)
Mike Stump39f36e32009-11-16 23:36:30 +0000267// CHECK-LL-NEXT: br label %if.end77
Mike Stumpf4a08d02009-11-17 00:14:04 +0000268// CHECK-LL: if.end77:
Mike Stump39f36e32009-11-16 23:36:30 +0000269// CHECK-LL-NEXT: store %class.test1_D* @test1_d, %class.test1_D** %cdp
Mike Stumpf4a08d02009-11-17 00:14:04 +0000270// CHECK-LL-NEXT: %tmp79 = load %class.test1_D** %cdp
271// CHECK-LL-NEXT: %cmp80 = icmp eq %class.test1_D* %tmp79, @test1_d
Mike Stump39f36e32009-11-16 23:36:30 +0000272// CHECK-LL-NEXT: br i1 %cmp80, label %if.then81, label %if.else83
Mike Stumpf4a08d02009-11-17 00:14:04 +0000273// CHECK-LL: if.then81:
274// CHECK-LL-NEXT: %call82 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 10)
Mike Stump39f36e32009-11-16 23:36:30 +0000275// CHECK-LL-NEXT: br label %if.end85
Mike Stumpf4a08d02009-11-17 00:14:04 +0000276// CHECK-LL: if.else83:
277// CHECK-LL-NEXT: %call84 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 10)
Mike Stump39f36e32009-11-16 23:36:30 +0000278// CHECK-LL-NEXT: br label %if.end85
Mike Stumpf4a08d02009-11-17 00:14:04 +0000279// CHECK-LL: if.end85:
Mike Stump39f36e32009-11-16 23:36:30 +0000280// CHECK-LL-NEXT: br i1 false, label %50, label %53
Mike Stumpf4a08d02009-11-17 00:14:04 +0000281// CHECK-LL: ; <label>:50
Mike Stumpa84b4042009-11-20 00:02:19 +0000282// CHECK-LL-NEXT: %51 = call i8* @__dynamic_cast(i8* null, i8* bitcast ({{.*}}* @_ZTI7test1_A to i8*), i8* bitcast ({{.*}} @_ZTI7test1_D to i8*), i64 -1)
Mike Stumpf4a08d02009-11-17 00:14:04 +0000283// CHECK-LL-NEXT: %52 = bitcast i8* %51 to %class.test1_D*
Mike Stump39f36e32009-11-16 23:36:30 +0000284// CHECK-LL-NEXT: br label %54
Mike Stumpf4a08d02009-11-17 00:14:04 +0000285// CHECK-LL: ; <label>:53
Mike Stump39f36e32009-11-16 23:36:30 +0000286// CHECK-LL-NEXT: br label %54
Mike Stumpf4a08d02009-11-17 00:14:04 +0000287// CHECK-LL: ; <label>:54
288// CHECK-LL-NEXT: %55 = phi %class.test1_D* [ %52, %50 ], [ null, %53 ]
Mike Stump39f36e32009-11-16 23:36:30 +0000289// CHECK-LL-NEXT: store %class.test1_D* %55, %class.test1_D** %dp
Mike Stumpf4a08d02009-11-17 00:14:04 +0000290// CHECK-LL-NEXT: %tmp86 = load %class.test1_D** %dp
291// CHECK-LL-NEXT: %cmp87 = icmp eq %class.test1_D* %tmp86, null
Mike Stump39f36e32009-11-16 23:36:30 +0000292// CHECK-LL-NEXT: br i1 %cmp87, label %if.then88, label %if.else90
Mike Stumpf4a08d02009-11-17 00:14:04 +0000293// CHECK-LL: if.then88:
294// CHECK-LL-NEXT: %call89 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 11)
Mike Stump39f36e32009-11-16 23:36:30 +0000295// CHECK-LL-NEXT: br label %if.end92
Mike Stumpf4a08d02009-11-17 00:14:04 +0000296// CHECK-LL: if.else90:
297// CHECK-LL-NEXT: %call91 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 11)
Mike Stump39f36e32009-11-16 23:36:30 +0000298// CHECK-LL-NEXT: br label %if.end92
Mike Stumpf4a08d02009-11-17 00:14:04 +0000299// CHECK-LL: if.end92:
Mike Stump39f36e32009-11-16 23:36:30 +0000300// CHECK-LL-NEXT: br i1 false, label %cast.null98, label %cast.notnull93
Mike Stumpf4a08d02009-11-17 00:14:04 +0000301// CHECK-LL: cast.notnull93:
302// CHECK-LL-NEXT: %vtable94 = load i8** bitcast (%class.test1_D* @test1_d to i8**)
303// CHECK-LL-NEXT: %vbase.offset.ptr95 = getelementptr i8* %vtable94, i64 -24
304// CHECK-LL-NEXT: %56 = bitcast i8* %vbase.offset.ptr95 to i64*
305// CHECK-LL-NEXT: %vbase.offset96 = load i64* %56
306// CHECK-LL-NEXT: %add.ptr97 = getelementptr i8* getelementptr inbounds (%class.test1_D* @test1_d, i32 0, i32 0, i32 0), i64 %vbase.offset96
307// CHECK-LL-NEXT: %57 = bitcast i8* %add.ptr97 to %class.test1_A*
Mike Stump39f36e32009-11-16 23:36:30 +0000308// CHECK-LL-NEXT: br label %cast.end99
Mike Stumpf4a08d02009-11-17 00:14:04 +0000309// CHECK-LL: cast.null98:
Mike Stump39f36e32009-11-16 23:36:30 +0000310// CHECK-LL-NEXT: br label %cast.end99
Mike Stumpf4a08d02009-11-17 00:14:04 +0000311// CHECK-LL: cast.end99:
312// CHECK-LL-NEXT: %58 = phi %class.test1_A* [ %57, %cast.notnull93 ], [ null, %cast.null98 ]
Mike Stump39f36e32009-11-16 23:36:30 +0000313// CHECK-LL-NEXT: store %class.test1_A* %58, %class.test1_A** %ap
Mike Stumpf4a08d02009-11-17 00:14:04 +0000314// CHECK-LL-NEXT: %tmp100 = load %class.test1_A** %ap
Mike Stump39f36e32009-11-16 23:36:30 +0000315// CHECK-LL-NEXT: br i1 false, label %cast.null106, label %cast.notnull101
Mike Stumpf4a08d02009-11-17 00:14:04 +0000316// CHECK-LL: cast.notnull101:
317// CHECK-LL-NEXT: %vtable102 = load i8** bitcast (%class.test1_D* @test1_d to i8**)
318// CHECK-LL-NEXT: %vbase.offset.ptr103 = getelementptr i8* %vtable102, i64 -24
319// CHECK-LL-NEXT: %59 = bitcast i8* %vbase.offset.ptr103 to i64*
320// CHECK-LL-NEXT: %vbase.offset104 = load i64* %59
321// CHECK-LL-NEXT: %add.ptr105 = getelementptr i8* getelementptr inbounds (%class.test1_D* @test1_d, i32 0, i32 0, i32 0), i64 %vbase.offset104
322// CHECK-LL-NEXT: %60 = bitcast i8* %add.ptr105 to %class.test1_A*
Mike Stump39f36e32009-11-16 23:36:30 +0000323// CHECK-LL-NEXT: br label %cast.end107
Mike Stumpf4a08d02009-11-17 00:14:04 +0000324// CHECK-LL: cast.null106:
Mike Stump39f36e32009-11-16 23:36:30 +0000325// CHECK-LL-NEXT: br label %cast.end107
Mike Stumpf4a08d02009-11-17 00:14:04 +0000326// CHECK-LL: cast.end107:
327// CHECK-LL-NEXT: %61 = phi %class.test1_A* [ %60, %cast.notnull101 ], [ null, %cast.null106 ]
328// CHECK-LL-NEXT: %cmp108 = icmp eq %class.test1_A* %tmp100, %61
Mike Stump39f36e32009-11-16 23:36:30 +0000329// CHECK-LL-NEXT: br i1 %cmp108, label %if.then109, label %if.else111
Mike Stumpf4a08d02009-11-17 00:14:04 +0000330// CHECK-LL: if.then109:
331// CHECK-LL-NEXT: %call110 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 12)
Mike Stump39f36e32009-11-16 23:36:30 +0000332// CHECK-LL-NEXT: br label %if.end113
Mike Stumpf4a08d02009-11-17 00:14:04 +0000333// CHECK-LL: if.else111:
334// CHECK-LL-NEXT: %call112 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 12)
Mike Stump39f36e32009-11-16 23:36:30 +0000335// CHECK-LL-NEXT: br label %if.end113
Mike Stumpf4a08d02009-11-17 00:14:04 +0000336// CHECK-LL: if.end113:
Mike Stump39f36e32009-11-16 23:36:30 +0000337// CHECK-LL-NEXT: br i1 false, label %cast.null116, label %cast.notnull115
Mike Stumpf4a08d02009-11-17 00:14:04 +0000338// CHECK-LL: cast.notnull115:
Mike Stump39f36e32009-11-16 23:36:30 +0000339// CHECK-LL-NEXT: br label %cast.end117
Mike Stumpf4a08d02009-11-17 00:14:04 +0000340// CHECK-LL: cast.null116:
Mike Stump39f36e32009-11-16 23:36:30 +0000341// CHECK-LL-NEXT: br label %cast.end117
Mike Stumpf4a08d02009-11-17 00:14:04 +0000342// CHECK-LL: cast.end117:
343// CHECK-LL-NEXT: %62 = phi %class.test1_E* [ bitcast (%class.test1_F* @test1_f to %class.test1_E*), %cast.notnull115 ], [ null, %cast.null116 ]
Mike Stump39f36e32009-11-16 23:36:30 +0000344// CHECK-LL-NEXT: store %class.test1_E* %62, %class.test1_E** %ep
Mike Stumpf4a08d02009-11-17 00:14:04 +0000345// CHECK-LL-NEXT: %tmp118 = load %class.test1_E** %ep
Mike Stump39f36e32009-11-16 23:36:30 +0000346// CHECK-LL-NEXT: br i1 false, label %cast.null120, label %cast.notnull119
Mike Stumpf4a08d02009-11-17 00:14:04 +0000347// CHECK-LL: cast.notnull119:
Mike Stump39f36e32009-11-16 23:36:30 +0000348// CHECK-LL-NEXT: br label %cast.end121
Mike Stumpf4a08d02009-11-17 00:14:04 +0000349// CHECK-LL: cast.null120:
Mike Stump39f36e32009-11-16 23:36:30 +0000350// CHECK-LL-NEXT: br label %cast.end121
Mike Stumpf4a08d02009-11-17 00:14:04 +0000351// CHECK-LL: cast.end121:
352// CHECK-LL-NEXT: %63 = phi %class.test1_E* [ bitcast (%class.test1_F* @test1_f to %class.test1_E*), %cast.notnull119 ], [ null, %cast.null120 ]
353// CHECK-LL-NEXT: %cmp122 = icmp eq %class.test1_E* %tmp118, %63
Mike Stump39f36e32009-11-16 23:36:30 +0000354// CHECK-LL-NEXT: br i1 %cmp122, label %if.then123, label %if.else125
Mike Stumpf4a08d02009-11-17 00:14:04 +0000355// CHECK-LL: if.then123:
356// CHECK-LL-NEXT: %call124 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 13)
Mike Stump39f36e32009-11-16 23:36:30 +0000357// CHECK-LL-NEXT: br label %if.end127
Mike Stumpf4a08d02009-11-17 00:14:04 +0000358// CHECK-LL: if.else125:
359// CHECK-LL-NEXT: %call126 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 13)
Mike Stump39f36e32009-11-16 23:36:30 +0000360// CHECK-LL-NEXT: br label %if.end127
Mike Stumpf4a08d02009-11-17 00:14:04 +0000361// CHECK-LL: if.end127:
362// CHECK-LL-NEXT: %tmp129 = load %class.test1_A** %ap
363// CHECK-LL-NEXT: %64 = icmp ne %class.test1_A* %tmp129, null
Mike Stump39f36e32009-11-16 23:36:30 +0000364// CHECK-LL-NEXT: br i1 %64, label %65, label %70
Mike Stumpf4a08d02009-11-17 00:14:04 +0000365// CHECK-LL: ; <label>:65
366// CHECK-LL-NEXT: %66 = bitcast %class.test1_A* %tmp129 to i64**
367// CHECK-LL-NEXT: %vtable130 = load i64** %66
368// CHECK-LL-NEXT: %67 = getelementptr inbounds i64* %vtable130, i64 -2
369// CHECK-LL-NEXT: %"offset to top" = load i64* %67
370// CHECK-LL-NEXT: %68 = bitcast %class.test1_A* %tmp129 to i8*
371// CHECK-LL-NEXT: %69 = getelementptr inbounds i8* %68, i64 %"offset to top"
Mike Stump39f36e32009-11-16 23:36:30 +0000372// CHECK-LL-NEXT: br label %71
Mike Stumpf4a08d02009-11-17 00:14:04 +0000373// CHECK-LL: ; <label>:70
Mike Stump39f36e32009-11-16 23:36:30 +0000374// CHECK-LL-NEXT: br label %71
Mike Stumpf4a08d02009-11-17 00:14:04 +0000375// CHECK-LL: ; <label>:71
376// CHECK-LL-NEXT: %72 = phi i8* [ %69, %65 ], [ null, %70 ]
Mike Stump39f36e32009-11-16 23:36:30 +0000377// CHECK-LL-NEXT: store i8* %72, i8** %vp
Mike Stumpf4a08d02009-11-17 00:14:04 +0000378// CHECK-LL-NEXT: %tmp131 = load i8** %vp
379// CHECK-LL-NEXT: %cmp132 = icmp eq i8* %tmp131, getelementptr inbounds (%class.test1_D* @test1_d, i32 0, i32 0, i32 0)
Mike Stump39f36e32009-11-16 23:36:30 +0000380// CHECK-LL-NEXT: br i1 %cmp132, label %if.then133, label %if.else135
Mike Stumpf4a08d02009-11-17 00:14:04 +0000381// CHECK-LL: if.then133:
382// CHECK-LL-NEXT: %call134 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 14)
Mike Stump39f36e32009-11-16 23:36:30 +0000383// CHECK-LL-NEXT: br label %if.end137
Mike Stumpf4a08d02009-11-17 00:14:04 +0000384// CHECK-LL: if.else135:
385// CHECK-LL-NEXT: %call136 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 14)
Mike Stump39f36e32009-11-16 23:36:30 +0000386// CHECK-LL-NEXT: br label %if.end137
Mike Stumpf4a08d02009-11-17 00:14:04 +0000387// CHECK-LL: if.end137:
388// CHECK-LL-NEXT: %tmp139 = load %class.test1_A** %ap
389// CHECK-LL-NEXT: %73 = icmp ne %class.test1_A* %tmp139, null
Mike Stump39f36e32009-11-16 23:36:30 +0000390// CHECK-LL-NEXT: br i1 %73, label %74, label %79
Mike Stumpf4a08d02009-11-17 00:14:04 +0000391// CHECK-LL: ; <label>:74
392// CHECK-LL-NEXT: %75 = bitcast %class.test1_A* %tmp139 to i64**
393// CHECK-LL-NEXT: %vtable140 = load i64** %75
394// CHECK-LL-NEXT: %76 = getelementptr inbounds i64* %vtable140, i64 -2
395// CHECK-LL-NEXT: %"offset to top141" = load i64* %76
396// CHECK-LL-NEXT: %77 = bitcast %class.test1_A* %tmp139 to i8*
397// CHECK-LL-NEXT: %78 = getelementptr inbounds i8* %77, i64 %"offset to top141"
Mike Stump39f36e32009-11-16 23:36:30 +0000398// CHECK-LL-NEXT: br label %80
Mike Stumpf4a08d02009-11-17 00:14:04 +0000399// CHECK-LL: ; <label>:79
Mike Stump39f36e32009-11-16 23:36:30 +0000400// CHECK-LL-NEXT: br label %80
Mike Stumpf4a08d02009-11-17 00:14:04 +0000401// CHECK-LL: ; <label>:80
402// CHECK-LL-NEXT: %81 = phi i8* [ %78, %74 ], [ null, %79 ]
Mike Stump39f36e32009-11-16 23:36:30 +0000403// CHECK-LL-NEXT: store i8* %81, i8** %cvp
Mike Stumpf4a08d02009-11-17 00:14:04 +0000404// CHECK-LL-NEXT: %tmp142 = load i8** %cvp
405// CHECK-LL-NEXT: %cmp143 = icmp eq i8* %tmp142, getelementptr inbounds (%class.test1_D* @test1_d, i32 0, i32 0, i32 0)
Mike Stump39f36e32009-11-16 23:36:30 +0000406// CHECK-LL-NEXT: br i1 %cmp143, label %if.then144, label %if.else146
Mike Stumpf4a08d02009-11-17 00:14:04 +0000407// CHECK-LL: if.then144:
408// CHECK-LL-NEXT: %call145 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 15)
Mike Stump39f36e32009-11-16 23:36:30 +0000409// CHECK-LL-NEXT: br label %if.end148
Mike Stumpf4a08d02009-11-17 00:14:04 +0000410// CHECK-LL: if.else146:
411// CHECK-LL-NEXT: %call147 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 15)
Mike Stump39f36e32009-11-16 23:36:30 +0000412// CHECK-LL-NEXT: br label %if.end148
Mike Stumpf4a08d02009-11-17 00:14:04 +0000413// CHECK-LL: if.end148:
Mike Stump39f36e32009-11-16 23:36:30 +0000414// CHECK-LL-NEXT: ret void