[cfe-commits] r88996 - /cfe/trunk/test/CodeGenCXX/dyncast.cpp

Daniel Dunbar daniel at zuster.org
Mon Nov 16 21:08:25 PST 2009


Actually, upon further though, please don't fix it. This test case is
too brittle overall.

I propose rewriting this to use the optimizer to check the code
generation. Basically:
 1. Change S(V, N) to something like if (!V) fail();
where fail is some extern function.
 2. Change test1 to be static, and to take the variables it uses as
input. Now add another function test2 which calls it with the things
you want to test.
 3. Use FileCheck to verify that the .ll for clang -O3 on the input
has no calls to fail() in it.

 - Daniel

On Mon, Nov 16, 2009 at 9:04 PM, Daniel Dunbar <daniel at zuster.org> wrote:
> Hi Mike,
>
> This test is going to break pretty bad on a -Asserts build. Can you fix it?
>
>  - Daniel
>
> On Mon, Nov 16, 2009 at 3:36 PM, Mike Stump <mrs at apple.com> wrote:
>> Author: mrs
>> Date: Mon Nov 16 17:36:30 2009
>> New Revision: 88996
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=88996&view=rev
>> Log:
>> Testcase for dynamic_cast.
>>
>> Added:
>>    cfe/trunk/test/CodeGenCXX/dyncast.cpp
>>
>> Added: cfe/trunk/test/CodeGenCXX/dyncast.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/dyncast.cpp?rev=88996&view=auto
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/dyncast.cpp (added)
>> +++ cfe/trunk/test/CodeGenCXX/dyncast.cpp Mon Nov 16 17:36:30 2009
>> @@ -0,0 +1,413 @@
>> +// RUN: clang-cc -I%S -triple x86_64-apple-darwin -std=c++0x -emit-llvm %s -o %t.ll
>> +// RUN: FileCheck -check-prefix LL --input-file=%t.ll %s
>> +
>> +#include <typeinfo>
>> +
>> +class test1_A { virtual void f() { } };
>> +class test1_B { virtual void g() { } };
>> +class test1_D : public virtual test1_A, private test1_B {};
>> +class test1_E : public test1_D, public test1_B {};
>> +class test1_F : public test1_E, public test1_D {};
>> +
>> +extern test1_D test1_d;
>> +extern test1_F test1_f;
>> +
>> +extern "C" int printf(const char *str...);
>> +
>> +#define S(V, N) if (V) printf("PASS: %d\n", N); else printf("FAIL: %d\n", N)
>> +
>> +void test1() {
>> +  test1_B* bp = (test1_B*)&test1_d;
>> +  test1_A* ap = &test1_d;
>> +  // This throws
>> +  //  test1_D&  dr = dynamic_cast<D&>(*bp);
>> +  test1_D* dp = dynamic_cast<test1_D*>(bp);
>> +  S(dp == 0, 1);
>> +  ap = dynamic_cast<test1_A*>(bp);
>> +  S(ap == 0, 2);
>> +  bp = dynamic_cast<test1_B*>(ap);
>> +  S(bp == 0, 3);
>> +  ap = dynamic_cast<test1_A*>(&test1_d);
>> +  S(ap != 0, 4);
>> +  // FIXME: Doesn't work yet, gcc fails this at comepile time
>> +  // bp = dynamic_cast<test1_B*>(&test1_d);
>> +  // S(bp == 0, 5);
>> +  {
>> +    test1_A*  ap  = &test1_f;
>> +    S(ap != 0, 6);
>> +    test1_D*  dp  = dynamic_cast<test1_D*>(ap);
>> +    S(dp == 0, 7);
>> +    // cast from virtual base
>> +    test1_E*  ep1 = dynamic_cast<test1_E*>(ap);
>> +    S(ep1 != 0, 8);
>> +  }
>> +  dp = dynamic_cast<test1_D*>(&test1_d);
>> +  S(dp == &test1_d, 9);
>> +  const test1_D *cdp = dynamic_cast<const test1_D*>(&test1_d);
>> +  S(cdp == &test1_d, 10);
>> +  dp = dynamic_cast<test1_D*>((test1_A*)0);
>> +  S(dp == 0, 11);
>> +  ap = dynamic_cast<test1_A*>(&test1_d);
>> +  S(ap == (test1_A*)&test1_d, 12);
>> +  test1_E* ep = dynamic_cast<test1_E*>(&test1_f);
>> +  S(ep == (test1_E*)&test1_f, 13);
>> +  void *vp = dynamic_cast<void*>(ap);
>> +  S(vp == &test1_d, 14);
>> +  const void *cvp = dynamic_cast<const void*>(ap);
>> +  S(cvp == &test1_d, 15);
>> +}
>> +
>> +// CHECK-LL:     define void @_Z5test1v() nounwind {
>> +// CHECK-LL-NEXT:entry:
>> +// CHECK-LL-NEXT:  %bp = alloca %class.test1_A*, align 8
>> +// CHECK-LL-NEXT:  %ap = alloca %class.test1_A*, align 8
>> +// CHECK-LL-NEXT:  %dp = alloca %class.test1_D*, align 8
>> +// CHECK-LL-NEXT:  %ap37 = alloca %class.test1_A*, align 8
>> +// CHECK-LL-NEXT:  %dp53 = alloca %class.test1_D*, align 8
>> +// CHECK-LL-NEXT:  %ep1 = alloca %class.test1_E*, align 8
>> +// CHECK-LL-NEXT:  %cdp = alloca %class.test1_D*, align 8
>> +// CHECK-LL-NEXT:  %ep = alloca %class.test1_E*, align 8
>> +// CHECK-LL-NEXT:  %vp = alloca i8*, align 8
>> +// CHECK-LL-NEXT:  %cvp = alloca i8*, align 8
>> +// CHECK-LL-NEXT:  br i1 false, label %cast.null, label %cast.notnull
>> +// CHECK-LL:       cast.notnull:
>> +// CHECK-LL-NEXT:  br label %cast.end
>> +// CHECK-LL:       cast.null:
>> +// CHECK-LL-NEXT:  br label %cast.end
>> +// CHECK-LL:       cast.end:
>> +// CHECK-LL-NEXT:  %0 = phi %class.test1_A* [ bitcast (%class.test1_D* @test1_d to %class.test1_A*), %cast.notnull ], [ null, %cast.null ]
>> +// CHECK-LL-NEXT:  store %class.test1_A* %0, %class.test1_A** %bp
>> +// CHECK-LL-NEXT:  br i1 false, label %cast.null2, label %cast.notnull1
>> +// CHECK-LL:       cast.notnull1:
>> +// CHECK-LL-NEXT:  %vtable = load i8** bitcast (%class.test1_D* @test1_d to i8**)
>> +// CHECK-LL-NEXT:  %vbase.offset.ptr = getelementptr i8* %vtable, i64 -24
>> +// CHECK-LL-NEXT:  %1 = bitcast i8* %vbase.offset.ptr to i64*
>> +// CHECK-LL-NEXT:  %vbase.offset = load i64* %1
>> +// CHECK-LL-NEXT:  %add.ptr = getelementptr i8* getelementptr inbounds (%class.test1_D* @test1_d, i32 0, i32 0, i32 0), i64 %vbase.offset
>> +// CHECK-LL-NEXT:  %2 = bitcast i8* %add.ptr to %class.test1_A*
>> +// CHECK-LL-NEXT:  br label %cast.end3
>> +// CHECK-LL:       cast.null2:
>> +// CHECK-LL-NEXT:  br label %cast.end3
>> +// CHECK-LL:       cast.end3:
>> +// CHECK-LL-NEXT:  %3 = phi %class.test1_A* [ %2, %cast.notnull1 ], [ null, %cast.null2 ]
>> +// CHECK-LL-NEXT:  store %class.test1_A* %3, %class.test1_A** %ap
>> +// CHECK-LL-NEXT:  %tmp = load %class.test1_A** %bp
>> +// CHECK-LL-NEXT:  %4 = icmp ne %class.test1_A* %tmp, null
>> +// CHECK-LL-NEXT:  br i1 %4, label %5, label %9
>> +// CHECK-LL:       ; <label>:5
>> +// CHECK-LL-NEXT:  %6 = bitcast %class.test1_A* %tmp to i8*
>> +// CHECK-LL-NEXT:  %7 = call i8* @__dynamic_cast(i8* %6, i8* bitcast (i8** @_ZTI7test1_B to i8*), i8* bitcast (i8** @_ZTI7test1_D to i8*), i64 -1)
>> +// CHECK-LL-NEXT:  %8 = bitcast i8* %7 to %class.test1_D*
>> +// CHECK-LL-NEXT:  br label %10
>> +// CHECK-LL:       ; <label>:9
>> +// CHECK-LL-NEXT:  br label %10
>> +// CHECK-LL:       ; <label>:10
>> +// CHECK-LL-NEXT:  %11 = phi %class.test1_D* [ %8, %5 ], [ null, %9 ]
>> +// CHECK-LL-NEXT:  store %class.test1_D* %11, %class.test1_D** %dp
>> +// CHECK-LL-NEXT:  %tmp4 = load %class.test1_D** %dp
>> +// CHECK-LL-NEXT:  %cmp = icmp eq %class.test1_D* %tmp4, null
>> +// CHECK-LL-NEXT:  br i1 %cmp, label %if.then, label %if.else
>> +// CHECK-LL:       if.then:
>> +// CHECK-LL-NEXT:  %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 1)
>> +// CHECK-LL-NEXT:  br label %if.end
>> +// CHECK-LL:       if.else:
>> +// CHECK-LL-NEXT:  %call5 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 1)
>> +// CHECK-LL-NEXT:  br label %if.end
>> +// CHECK-LL:       if.end:
>> +// CHECK-LL-NEXT:  %tmp6 = load %class.test1_A** %bp
>> +// CHECK-LL-NEXT:  %12 = icmp ne %class.test1_A* %tmp6, null
>> +// CHECK-LL-NEXT:  br i1 %12, label %13, label %17
>> +// CHECK-LL:       ; <label>:13
>> +// CHECK-LL-NEXT:  %14 = bitcast %class.test1_A* %tmp6 to i8*
>> +// CHECK-LL-NEXT:  %15 = call i8* @__dynamic_cast(i8* %14, i8* bitcast (i8** @_ZTI7test1_B to i8*), i8* bitcast (i8** @_ZTI7test1_A to i8*), i64 -1)
>> +// CHECK-LL-NEXT:  %16 = bitcast i8* %15 to %class.test1_A*
>> +// CHECK-LL-NEXT:  br label %18
>> +// CHECK-LL:       ; <label>:17
>> +// CHECK-LL-NEXT:  br label %18
>> +// CHECK-LL:       ; <label>:18
>> +// CHECK-LL-NEXT:  %19 = phi %class.test1_A* [ %16, %13 ], [ null, %17 ]
>> +// CHECK-LL-NEXT:  store %class.test1_A* %19, %class.test1_A** %ap
>> +// CHECK-LL-NEXT:  %tmp7 = load %class.test1_A** %ap
>> +// CHECK-LL-NEXT:  %cmp8 = icmp eq %class.test1_A* %tmp7, null
>> +// CHECK-LL-NEXT:  br i1 %cmp8, label %if.then9, label %if.else11
>> +// CHECK-LL:       if.then9:
>> +// CHECK-LL-NEXT:  %call10 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 2)
>> +// CHECK-LL-NEXT:  br label %if.end13
>> +// CHECK-LL:       if.else11:
>> +// CHECK-LL-NEXT:  %call12 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 2)
>> +// CHECK-LL-NEXT:  br label %if.end13
>> +// CHECK-LL:       if.end13:
>> +// CHECK-LL-NEXT:  %tmp14 = load %class.test1_A** %ap
>> +// CHECK-LL-NEXT:  %20 = icmp ne %class.test1_A* %tmp14, null
>> +// CHECK-LL-NEXT:  br i1 %20, label %21, label %25
>> +// CHECK-LL:       ; <label>:21
>> +// CHECK-LL-NEXT:  %22 = bitcast %class.test1_A* %tmp14 to i8*
>> +// CHECK-LL-NEXT:  %23 = call i8* @__dynamic_cast(i8* %22, i8* bitcast (i8** @_ZTI7test1_A to i8*), i8* bitcast (i8** @_ZTI7test1_B to i8*), i64 -1)
>> +// CHECK-LL-NEXT:  %24 = bitcast i8* %23 to %class.test1_A*
>> +// CHECK-LL-NEXT:  br label %26
>> +// CHECK-LL:       ; <label>:25
>> +// CHECK-LL-NEXT:  br label %26
>> +// CHECK-LL:       ; <label>:26
>> +// CHECK-LL-NEXT:  %27 = phi %class.test1_A* [ %24, %21 ], [ null, %25 ]
>> +// CHECK-LL-NEXT:  store %class.test1_A* %27, %class.test1_A** %bp
>> +// CHECK-LL-NEXT:  %tmp15 = load %class.test1_A** %bp
>> +// CHECK-LL-NEXT:  %cmp16 = icmp eq %class.test1_A* %tmp15, null
>> +// CHECK-LL-NEXT:  br i1 %cmp16, label %if.then17, label %if.else19
>> +// CHECK-LL:       if.then17:
>> +// CHECK-LL-NEXT:  %call18 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 3)
>> +// CHECK-LL-NEXT:  br label %if.end21
>> +// CHECK-LL:       if.else19:
>> +// CHECK-LL-NEXT:  %call20 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 3)
>> +// CHECK-LL-NEXT:  br label %if.end21
>> +// CHECK-LL:       if.end21:
>> +// CHECK-LL-NEXT:  br i1 false, label %cast.null27, label %cast.notnull22
>> +// CHECK-LL:       cast.notnull22:
>> +// CHECK-LL-NEXT:  %vtable23 = load i8** bitcast (%class.test1_D* @test1_d to i8**)
>> +// CHECK-LL-NEXT:  %vbase.offset.ptr24 = getelementptr i8* %vtable23, i64 -24
>> +// CHECK-LL-NEXT:  %28 = bitcast i8* %vbase.offset.ptr24 to i64*
>> +// CHECK-LL-NEXT:  %vbase.offset25 = load i64* %28
>> +// CHECK-LL-NEXT:  %add.ptr26 = getelementptr i8* getelementptr inbounds (%class.test1_D* @test1_d, i32 0, i32 0, i32 0), i64 %vbase.offset25
>> +// CHECK-LL-NEXT:  %29 = bitcast i8* %add.ptr26 to %class.test1_A*
>> +// CHECK-LL-NEXT:  br label %cast.end28
>> +// CHECK-LL:       cast.null27:
>> +// CHECK-LL-NEXT:  br label %cast.end28
>> +// CHECK-LL:       cast.end28:
>> +// CHECK-LL-NEXT:  %30 = phi %class.test1_A* [ %29, %cast.notnull22 ], [ null, %cast.null27 ]
>> +// CHECK-LL-NEXT:  store %class.test1_A* %30, %class.test1_A** %ap
>> +// CHECK-LL-NEXT:  %tmp29 = load %class.test1_A** %ap
>> +// CHECK-LL-NEXT:  %cmp30 = icmp ne %class.test1_A* %tmp29, null
>> +// CHECK-LL-NEXT:  br i1 %cmp30, label %if.then31, label %if.else33
>> +// CHECK-LL:       if.then31:
>> +// CHECK-LL-NEXT:  %call32 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 4)
>> +// CHECK-LL-NEXT:  br label %if.end35
>> +// CHECK-LL:       if.else33:
>> +// CHECK-LL-NEXT:  %call34 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 4)
>> +// CHECK-LL-NEXT:  br label %if.end35
>> +// CHECK-LL:       if.end35:
>> +// CHECK-LL-NEXT:  br i1 false, label %cast.null43, label %cast.notnull38
>> +// CHECK-LL:       cast.notnull38:
>> +// CHECK-LL-NEXT:  %vtable39 = load i8** bitcast (%class.test1_F* @test1_f to i8**)
>> +// CHECK-LL-NEXT:  %vbase.offset.ptr40 = getelementptr i8* %vtable39, i64 -24
>> +// CHECK-LL-NEXT:  %31 = bitcast i8* %vbase.offset.ptr40 to i64*
>> +// CHECK-LL-NEXT:  %vbase.offset41 = load i64* %31
>> +// CHECK-LL-NEXT:  %add.ptr42 = getelementptr i8* getelementptr inbounds (%class.test1_F* @test1_f, i32 0, i32 0, i32 0), i64 %vbase.offset41
>> +// CHECK-LL-NEXT:  %32 = bitcast i8* %add.ptr42 to %class.test1_A*
>> +// CHECK-LL-NEXT:  br label %cast.end44
>> +// CHECK-LL:       cast.null43:
>> +// CHECK-LL-NEXT:  br label %cast.end44
>> +// CHECK-LL:       cast.end44:
>> +// CHECK-LL-NEXT:  %33 = phi %class.test1_A* [ %32, %cast.notnull38 ], [ null, %cast.null43 ]
>> +// CHECK-LL-NEXT:  store %class.test1_A* %33, %class.test1_A** %ap37
>> +// CHECK-LL-NEXT:  %tmp45 = load %class.test1_A** %ap37
>> +// CHECK-LL-NEXT:  %cmp46 = icmp ne %class.test1_A* %tmp45, null
>> +// CHECK-LL-NEXT:  br i1 %cmp46, label %if.then47, label %if.else49
>> +// CHECK-LL:       if.then47:
>> +// CHECK-LL-NEXT:  %call48 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 6)
>> +// CHECK-LL-NEXT:  br label %if.end51
>> +// CHECK-LL:       if.else49:
>> +// CHECK-LL-NEXT:  %call50 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 6)
>> +// CHECK-LL-NEXT:  br label %if.end51
>> +// CHECK-LL:       if.end51:
>> +// CHECK-LL-NEXT:  %tmp54 = load %class.test1_A** %ap37
>> +// CHECK-LL-NEXT:  %34 = icmp ne %class.test1_A* %tmp54, null
>> +// CHECK-LL-NEXT:  br i1 %34, label %35, label %39
>> +// CHECK-LL:       ; <label>:35
>> +// CHECK-LL-NEXT:  %36 = bitcast %class.test1_A* %tmp54 to i8*
>> +// CHECK-LL-NEXT:  %37 = call i8* @__dynamic_cast(i8* %36, i8* bitcast (i8** @_ZTI7test1_A to i8*), i8* bitcast (i8** @_ZTI7test1_D to i8*), i64 -1)
>> +// CHECK-LL-NEXT:  %38 = bitcast i8* %37 to %class.test1_D*
>> +// CHECK-LL-NEXT:  br label %40
>> +// CHECK-LL:       ; <label>:39
>> +// CHECK-LL-NEXT:  br label %40
>> +// CHECK-LL:       ; <label>:40
>> +// CHECK-LL-NEXT:  %41 = phi %class.test1_D* [ %38, %35 ], [ null, %39 ]
>> +// CHECK-LL-NEXT:  store %class.test1_D* %41, %class.test1_D** %dp53
>> +// CHECK-LL-NEXT:  %tmp55 = load %class.test1_D** %dp53
>> +// CHECK-LL-NEXT:  %cmp56 = icmp eq %class.test1_D* %tmp55, null
>> +// CHECK-LL-NEXT:  br i1 %cmp56, label %if.then57, label %if.else59
>> +// CHECK-LL:       if.then57:
>> +// CHECK-LL-NEXT:  %call58 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 7)
>> +// CHECK-LL-NEXT:  br label %if.end61
>> +// CHECK-LL:       if.else59:
>> +// CHECK-LL-NEXT:  %call60 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 7)
>> +// CHECK-LL-NEXT:  br label %if.end61
>> +// CHECK-LL:       if.end61:
>> +// CHECK-LL-NEXT:  %tmp63 = load %class.test1_A** %ap37
>> +// CHECK-LL-NEXT:  %42 = icmp ne %class.test1_A* %tmp63, null
>> +// CHECK-LL-NEXT:  br i1 %42, label %43, label %47
>> +// CHECK-LL:       ; <label>:43
>> +// CHECK-LL-NEXT:  %44 = bitcast %class.test1_A* %tmp63 to i8*
>> +// CHECK-LL-NEXT:  %45 = call i8* @__dynamic_cast(i8* %44, i8* bitcast (i8** @_ZTI7test1_A to i8*), i8* bitcast (i8** @_ZTI7test1_E to i8*), i64 -1)
>> +// CHECK-LL-NEXT:  %46 = bitcast i8* %45 to %class.test1_E*
>> +// CHECK-LL-NEXT:  br label %48
>> +// CHECK-LL:       ; <label>:47
>> +// CHECK-LL-NEXT:  br label %48
>> +// CHECK-LL:       ; <label>:48
>> +// CHECK-LL-NEXT:  %49 = phi %class.test1_E* [ %46, %43 ], [ null, %47 ]
>> +// CHECK-LL-NEXT:  store %class.test1_E* %49, %class.test1_E** %ep1
>> +// CHECK-LL-NEXT:  %tmp64 = load %class.test1_E** %ep1
>> +// CHECK-LL-NEXT:  %cmp65 = icmp ne %class.test1_E* %tmp64, null
>> +// CHECK-LL-NEXT:  br i1 %cmp65, label %if.then66, label %if.else68
>> +// CHECK-LL:       if.then66:
>> +// CHECK-LL-NEXT:  %call67 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 8)
>> +// CHECK-LL-NEXT:  br label %if.end70
>> +// CHECK-LL:       if.else68:
>> +// CHECK-LL-NEXT:  %call69 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 8)
>> +// CHECK-LL-NEXT:  br label %if.end70
>> +// CHECK-LL:       if.end70:
>> +// CHECK-LL-NEXT:  store %class.test1_D* @test1_d, %class.test1_D** %dp
>> +// CHECK-LL-NEXT:  %tmp71 = load %class.test1_D** %dp
>> +// CHECK-LL-NEXT:  %cmp72 = icmp eq %class.test1_D* %tmp71, @test1_d
>> +// CHECK-LL-NEXT:  br i1 %cmp72, label %if.then73, label %if.else75
>> +// CHECK-LL:       if.then73:
>> +// CHECK-LL-NEXT:  %call74 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 9)
>> +// CHECK-LL-NEXT:  br label %if.end77
>> +// CHECK-LL:       if.else75:
>> +// CHECK-LL-NEXT:  %call76 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 9)
>> +// CHECK-LL-NEXT:  br label %if.end77
>> +// CHECK-LL:       if.end77:
>> +// CHECK-LL-NEXT:  store %class.test1_D* @test1_d, %class.test1_D** %cdp
>> +// CHECK-LL-NEXT:  %tmp79 = load %class.test1_D** %cdp
>> +// CHECK-LL-NEXT:  %cmp80 = icmp eq %class.test1_D* %tmp79, @test1_d
>> +// CHECK-LL-NEXT:  br i1 %cmp80, label %if.then81, label %if.else83
>> +// CHECK-LL:       if.then81:
>> +// CHECK-LL-NEXT:  %call82 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 10)
>> +// CHECK-LL-NEXT:  br label %if.end85
>> +// CHECK-LL:       if.else83:
>> +// CHECK-LL-NEXT:  %call84 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 10)
>> +// CHECK-LL-NEXT:  br label %if.end85
>> +// CHECK-LL:       if.end85:
>> +// CHECK-LL-NEXT:  br i1 false, label %50, label %53
>> +// CHECK-LL:       ; <label>:50
>> +// CHECK-LL-NEXT:  %51 = call i8* @__dynamic_cast(i8* null, i8* bitcast (i8** @_ZTI7test1_A to i8*), i8* bitcast (i8** @_ZTI7test1_D to i8*), i64 -1)
>> +// CHECK-LL-NEXT:  %52 = bitcast i8* %51 to %class.test1_D*
>> +// CHECK-LL-NEXT:  br label %54
>> +// CHECK-LL:       ; <label>:53
>> +// CHECK-LL-NEXT:  br label %54
>> +// CHECK-LL:       ; <label>:54
>> +// CHECK-LL-NEXT:  %55 = phi %class.test1_D* [ %52, %50 ], [ null, %53 ]
>> +// CHECK-LL-NEXT:  store %class.test1_D* %55, %class.test1_D** %dp
>> +// CHECK-LL-NEXT:  %tmp86 = load %class.test1_D** %dp
>> +// CHECK-LL-NEXT:  %cmp87 = icmp eq %class.test1_D* %tmp86, null
>> +// CHECK-LL-NEXT:  br i1 %cmp87, label %if.then88, label %if.else90
>> +// CHECK-LL:       if.then88:
>> +// CHECK-LL-NEXT:  %call89 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 11)
>> +// CHECK-LL-NEXT:  br label %if.end92
>> +// CHECK-LL:       if.else90:
>> +// CHECK-LL-NEXT:  %call91 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 11)
>> +// CHECK-LL-NEXT:  br label %if.end92
>> +// CHECK-LL:       if.end92:
>> +// CHECK-LL-NEXT:  br i1 false, label %cast.null98, label %cast.notnull93
>> +// CHECK-LL:       cast.notnull93:
>> +// CHECK-LL-NEXT:  %vtable94 = load i8** bitcast (%class.test1_D* @test1_d to i8**)
>> +// CHECK-LL-NEXT:  %vbase.offset.ptr95 = getelementptr i8* %vtable94, i64 -24
>> +// CHECK-LL-NEXT:  %56 = bitcast i8* %vbase.offset.ptr95 to i64*
>> +// CHECK-LL-NEXT:  %vbase.offset96 = load i64* %56
>> +// CHECK-LL-NEXT:  %add.ptr97 = getelementptr i8* getelementptr inbounds (%class.test1_D* @test1_d, i32 0, i32 0, i32 0), i64 %vbase.offset96
>> +// CHECK-LL-NEXT:  %57 = bitcast i8* %add.ptr97 to %class.test1_A*
>> +// CHECK-LL-NEXT:  br label %cast.end99
>> +// CHECK-LL:       cast.null98:
>> +// CHECK-LL-NEXT:  br label %cast.end99
>> +// CHECK-LL:       cast.end99:
>> +// CHECK-LL-NEXT:  %58 = phi %class.test1_A* [ %57, %cast.notnull93 ], [ null, %cast.null98 ]
>> +// CHECK-LL-NEXT:  store %class.test1_A* %58, %class.test1_A** %ap
>> +// CHECK-LL-NEXT:  %tmp100 = load %class.test1_A** %ap
>> +// CHECK-LL-NEXT:  br i1 false, label %cast.null106, label %cast.notnull101
>> +// CHECK-LL:       cast.notnull101:
>> +// CHECK-LL-NEXT:  %vtable102 = load i8** bitcast (%class.test1_D* @test1_d to i8**)
>> +// CHECK-LL-NEXT:  %vbase.offset.ptr103 = getelementptr i8* %vtable102, i64 -24
>> +// CHECK-LL-NEXT:  %59 = bitcast i8* %vbase.offset.ptr103 to i64*
>> +// CHECK-LL-NEXT:  %vbase.offset104 = load i64* %59
>> +// CHECK-LL-NEXT:  %add.ptr105 = getelementptr i8* getelementptr inbounds (%class.test1_D* @test1_d, i32 0, i32 0, i32 0), i64 %vbase.offset104
>> +// CHECK-LL-NEXT:  %60 = bitcast i8* %add.ptr105 to %class.test1_A*
>> +// CHECK-LL-NEXT:  br label %cast.end107
>> +// CHECK-LL:       cast.null106:
>> +// CHECK-LL-NEXT:  br label %cast.end107
>> +// CHECK-LL:       cast.end107:
>> +// CHECK-LL-NEXT:  %61 = phi %class.test1_A* [ %60, %cast.notnull101 ], [ null, %cast.null106 ]
>> +// CHECK-LL-NEXT:  %cmp108 = icmp eq %class.test1_A* %tmp100, %61
>> +// CHECK-LL-NEXT:  br i1 %cmp108, label %if.then109, label %if.else111
>> +// CHECK-LL:       if.then109:
>> +// CHECK-LL-NEXT:  %call110 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 12)
>> +// CHECK-LL-NEXT:  br label %if.end113
>> +// CHECK-LL:       if.else111:
>> +// CHECK-LL-NEXT:  %call112 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 12)
>> +// CHECK-LL-NEXT:  br label %if.end113
>> +// CHECK-LL:       if.end113:
>> +// CHECK-LL-NEXT:  br i1 false, label %cast.null116, label %cast.notnull115
>> +// CHECK-LL:       cast.notnull115:
>> +// CHECK-LL-NEXT:  br label %cast.end117
>> +// CHECK-LL:       cast.null116:
>> +// CHECK-LL-NEXT:  br label %cast.end117
>> +// CHECK-LL:       cast.end117:
>> +// CHECK-LL-NEXT:  %62 = phi %class.test1_E* [ bitcast (%class.test1_F* @test1_f to %class.test1_E*), %cast.notnull115 ], [ null, %cast.null116 ]
>> +// CHECK-LL-NEXT:  store %class.test1_E* %62, %class.test1_E** %ep
>> +// CHECK-LL-NEXT:  %tmp118 = load %class.test1_E** %ep
>> +// CHECK-LL-NEXT:  br i1 false, label %cast.null120, label %cast.notnull119
>> +// CHECK-LL:       cast.notnull119:
>> +// CHECK-LL-NEXT:  br label %cast.end121
>> +// CHECK-LL:       cast.null120:
>> +// CHECK-LL-NEXT:  br label %cast.end121
>> +// CHECK-LL:       cast.end121:
>> +// CHECK-LL-NEXT:  %63 = phi %class.test1_E* [ bitcast (%class.test1_F* @test1_f to %class.test1_E*), %cast.notnull119 ], [ null, %cast.null120 ]
>> +// CHECK-LL-NEXT:  %cmp122 = icmp eq %class.test1_E* %tmp118, %63
>> +// CHECK-LL-NEXT:  br i1 %cmp122, label %if.then123, label %if.else125
>> +// CHECK-LL:       if.then123:
>> +// CHECK-LL-NEXT:  %call124 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 13)
>> +// CHECK-LL-NEXT:  br label %if.end127
>> +// CHECK-LL:       if.else125:
>> +// CHECK-LL-NEXT:  %call126 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 13)
>> +// CHECK-LL-NEXT:  br label %if.end127
>> +// CHECK-LL:       if.end127:
>> +// CHECK-LL-NEXT:  %tmp129 = load %class.test1_A** %ap
>> +// CHECK-LL-NEXT:  %64 = icmp ne %class.test1_A* %tmp129, null
>> +// CHECK-LL-NEXT:  br i1 %64, label %65, label %70
>> +// CHECK-LL:       ; <label>:65
>> +// CHECK-LL-NEXT:  %66 = bitcast %class.test1_A* %tmp129 to i64**
>> +// CHECK-LL-NEXT:  %vtable130 = load i64** %66
>> +// CHECK-LL-NEXT:  %67 = getelementptr inbounds i64* %vtable130, i64 -2
>> +// CHECK-LL-NEXT:  %"offset to top" = load i64* %67
>> +// CHECK-LL-NEXT:  %68 = bitcast %class.test1_A* %tmp129 to i8*
>> +// CHECK-LL-NEXT:  %69 = getelementptr inbounds i8* %68, i64 %"offset to top"
>> +// CHECK-LL-NEXT:  br label %71
>> +// CHECK-LL:       ; <label>:70
>> +// CHECK-LL-NEXT:  br label %71
>> +// CHECK-LL:       ; <label>:71
>> +// CHECK-LL-NEXT:  %72 = phi i8* [ %69, %65 ], [ null, %70 ]
>> +// CHECK-LL-NEXT:  store i8* %72, i8** %vp
>> +// CHECK-LL-NEXT:  %tmp131 = load i8** %vp
>> +// CHECK-LL-NEXT:  %cmp132 = icmp eq i8* %tmp131, getelementptr inbounds (%class.test1_D* @test1_d, i32 0, i32 0, i32 0)
>> +// CHECK-LL-NEXT:  br i1 %cmp132, label %if.then133, label %if.else135
>> +// CHECK-LL:       if.then133:
>> +// CHECK-LL-NEXT:  %call134 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 14)
>> +// CHECK-LL-NEXT:  br label %if.end137
>> +// CHECK-LL:       if.else135:
>> +// CHECK-LL-NEXT:  %call136 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 14)
>> +// CHECK-LL-NEXT:  br label %if.end137
>> +// CHECK-LL:       if.end137:
>> +// CHECK-LL-NEXT:  %tmp139 = load %class.test1_A** %ap
>> +// CHECK-LL-NEXT:  %73 = icmp ne %class.test1_A* %tmp139, null
>> +// CHECK-LL-NEXT:  br i1 %73, label %74, label %79
>> +// CHECK-LL:       ; <label>:74
>> +// CHECK-LL-NEXT:  %75 = bitcast %class.test1_A* %tmp139 to i64**
>> +// CHECK-LL-NEXT:  %vtable140 = load i64** %75
>> +// CHECK-LL-NEXT:  %76 = getelementptr inbounds i64* %vtable140, i64 -2
>> +// CHECK-LL-NEXT:  %"offset to top141" = load i64* %76
>> +// CHECK-LL-NEXT:  %77 = bitcast %class.test1_A* %tmp139 to i8*
>> +// CHECK-LL-NEXT:  %78 = getelementptr inbounds i8* %77, i64 %"offset to top141"
>> +// CHECK-LL-NEXT:  br label %80
>> +// CHECK-LL:       ; <label>:79
>> +// CHECK-LL-NEXT:  br label %80
>> +// CHECK-LL:       ; <label>:80
>> +// CHECK-LL-NEXT:  %81 = phi i8* [ %78, %74 ], [ null, %79 ]
>> +// CHECK-LL-NEXT:  store i8* %81, i8** %cvp
>> +// CHECK-LL-NEXT:  %tmp142 = load i8** %cvp
>> +// CHECK-LL-NEXT:  %cmp143 = icmp eq i8* %tmp142, getelementptr inbounds (%class.test1_D* @test1_d, i32 0, i32 0, i32 0)
>> +// CHECK-LL-NEXT:  br i1 %cmp143, label %if.then144, label %if.else146
>> +// CHECK-LL:       if.then144:
>> +// CHECK-LL-NEXT:  %call145 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 15)
>> +// CHECK-LL-NEXT:  br label %if.end148
>> +// CHECK-LL:       if.else146:
>> +// CHECK-LL-NEXT:  %call147 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str1, i32 0, i32 0), i32 15)
>> +// CHECK-LL-NEXT:  br label %if.end148
>> +// CHECK-LL:       if.end148:
>> +// CHECK-LL-NEXT:  ret void
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>




More information about the cfe-commits mailing list