r223267 - Cast vtable address points to i32 (...)** to enable more globalopt

Rafael EspĂ­ndola rafael.espindola at gmail.com
Wed Dec 3 13:53:56 PST 2014


Didn't Chandler just modified instcombine to go the other way?

On 3 December 2014 at 16:00, Reid Kleckner <reid at kleckner.net> wrote:
> Author: rnk
> Date: Wed Dec  3 15:00:21 2014
> New Revision: 223267
>
> URL: http://llvm.org/viewvc/llvm-project?rev=223267&view=rev
> Log:
> Cast vtable address points to i32 (...)** to enable more globalopt
>
> We currently use i32 (...)** as the type of the vptr field in the LLVM
> struct type. LLVM's GlobalOpt prefers any bitcasts to be on the side of
> the data being stored rather than on the pointer being stored to.
>
> Reviewers: majnemer
>
> Differential Revision: http://reviews.llvm.org/D5916
>
> Added:
>     cfe/trunk/test/CodeGenCXX/ctor-globalopt.cpp
> Modified:
>     cfe/trunk/lib/CodeGen/CGClass.cpp
>     cfe/trunk/test/CodeGenCXX/constructor-init.cpp
>     cfe/trunk/test/CodeGenCXX/copy-constructor-synthesis-2.cpp
>     cfe/trunk/test/CodeGenCXX/copy-constructor-synthesis.cpp
>     cfe/trunk/test/CodeGenCXX/microsoft-abi-multiple-nonvirtual-inheritance.cpp
>     cfe/trunk/test/CodeGenCXX/microsoft-abi-structors.cpp
>     cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-inheritance.cpp
>     cfe/trunk/test/CodeGenCXX/microsoft-interface.cpp
>     cfe/trunk/test/CodeGenCXX/skip-vtable-pointer-initialization.cpp
>     cfe/trunk/test/CodeGenCXX/vtable-pointer-initialization.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGClass.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGClass.cpp?rev=223267&r1=223266&r2=223267&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGClass.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGClass.cpp Wed Dec  3 15:00:21 2014
> @@ -1982,10 +1982,14 @@ CodeGenFunction::InitializeVTablePointer
>                                                    NonVirtualOffset,
>                                                    VirtualOffset);
>
> -  // Finally, store the address point.
> -  llvm::Type *AddressPointPtrTy =
> -    VTableAddressPoint->getType()->getPointerTo();
> -  VTableField = Builder.CreateBitCast(VTableField, AddressPointPtrTy);
> +  // Finally, store the address point. Use the same LLVM types as the field to
> +  // support optimization.
> +  llvm::Type *VTablePtrTy =
> +      llvm::FunctionType::get(CGM.Int32Ty, /*isVarArg=*/true)
> +          ->getPointerTo()
> +          ->getPointerTo();
> +  VTableField = Builder.CreateBitCast(VTableField, VTablePtrTy->getPointerTo());
> +  VTableAddressPoint = Builder.CreateBitCast(VTableAddressPoint, VTablePtrTy);
>    llvm::StoreInst *Store = Builder.CreateStore(VTableAddressPoint, VTableField);
>    CGM.DecorateInstruction(Store, CGM.getTBAAInfoForVTablePtr());
>  }
>
> Modified: cfe/trunk/test/CodeGenCXX/constructor-init.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/constructor-init.cpp?rev=223267&r1=223266&r2=223267&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/constructor-init.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/constructor-init.cpp Wed Dec  3 15:00:21 2014
> @@ -94,23 +94,23 @@ namespace InitVTable {
>    };
>
>    // CHECK-LABEL: define void @_ZN10InitVTable1BC2Ev(%"struct.InitVTable::B"* %this) unnamed_addr
> -  // CHECK:      [[T0:%.*]] = bitcast [[B:%.*]]* [[THIS:%.*]] to i8***
> -  // CHECK-NEXT: store i8** getelementptr inbounds ([3 x i8*]* @_ZTVN10InitVTable1BE, i64 0, i64 2), i8*** [[T0]]
> +  // CHECK:      [[T0:%.*]] = bitcast [[B:%.*]]* [[THIS:%.*]] to i32 (...)***
> +  // CHECK-NEXT: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @_ZTVN10InitVTable1BE, i64 0, i64 2) to i32 (...)**), i32 (...)*** [[T0]]
>    // CHECK:      [[VTBL:%.*]] = load i32 ([[B]]*)*** {{%.*}}
>    // CHECK-NEXT: [[FNP:%.*]] = getelementptr inbounds i32 ([[B]]*)** [[VTBL]], i64 0
>    // CHECK-NEXT: [[FN:%.*]] = load i32 ([[B]]*)** [[FNP]]
>    // CHECK-NEXT: [[ARG:%.*]] = call i32 [[FN]]([[B]]* [[THIS]])
>    // CHECK-NEXT: call void @_ZN10InitVTable1AC2Ei({{.*}}* {{%.*}}, i32 [[ARG]])
> -  // CHECK-NEXT: [[T0:%.*]] = bitcast [[B]]* [[THIS]] to i8***
> -  // CHECK-NEXT: store i8** getelementptr inbounds ([3 x i8*]* @_ZTVN10InitVTable1BE, i64 0, i64 2), i8*** [[T0]]
> +  // CHECK-NEXT: [[T0:%.*]] = bitcast [[B]]* [[THIS]] to i32 (...)***
> +  // CHECK-NEXT: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @_ZTVN10InitVTable1BE, i64 0, i64 2) to i32 (...)**), i32 (...)*** [[T0]]
>    // CHECK-NEXT: ret void
>    B::B() : A(foo()) {}
>
>    // CHECK-LABEL: define void @_ZN10InitVTable1BC2Ei(%"struct.InitVTable::B"* %this, i32 %x) unnamed_addr
>    // CHECK:      [[ARG:%.*]] = add nsw i32 {{%.*}}, 5
>    // CHECK-NEXT: call void @_ZN10InitVTable1AC2Ei({{.*}}* {{%.*}}, i32 [[ARG]])
> -  // CHECK-NEXT: [[T0:%.*]] = bitcast [[B]]* {{%.*}} to i8***
> -  // CHECK-NEXT: store i8** getelementptr inbounds ([3 x i8*]* @_ZTVN10InitVTable1BE, i64 0, i64 2), i8*** [[T0]]
> +  // CHECK-NEXT: [[T0:%.*]] = bitcast [[B]]* {{%.*}} to i32 (...)***
> +  // CHECK-NEXT: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @_ZTVN10InitVTable1BE, i64 0, i64 2) to i32 (...)**), i32 (...)*** [[T0]]
>    // CHECK-NEXT: ret void
>    B::B(int x) : A(x + 5) {}
>  }
>
> Modified: cfe/trunk/test/CodeGenCXX/copy-constructor-synthesis-2.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/copy-constructor-synthesis-2.cpp?rev=223267&r1=223266&r2=223267&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/copy-constructor-synthesis-2.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/copy-constructor-synthesis-2.cpp Wed Dec  3 15:00:21 2014
> @@ -4,4 +4,4 @@ struct A { virtual void a(); };
>  A x(A& y) { return y; }
>
>  // CHECK: define linkonce_odr {{.*}} @_ZN1AC1ERKS_(%struct.A* {{.*}}%this, %struct.A* dereferenceable({{[0-9]+}})) unnamed_addr
> -// CHECK: store i8** getelementptr inbounds ([3 x i8*]* @_ZTV1A, i64 0, i64 2)
> +// CHECK: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @_ZTV1A, i64 0, i64 2) to i32 (...)**)
>
> Modified: cfe/trunk/test/CodeGenCXX/copy-constructor-synthesis.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/copy-constructor-synthesis.cpp?rev=223267&r1=223266&r2=223267&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/copy-constructor-synthesis.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/copy-constructor-synthesis.cpp Wed Dec  3 15:00:21 2014
> @@ -148,8 +148,8 @@ void f(B b1) {
>
>  // CHECK-LABEL:    define linkonce_odr void @_ZN12rdar138169401AC2ERKS0_(
>  // CHECK:      [[THIS:%.*]] = load [[A]]**
> -// CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[THIS]] to i8***
> -// CHECK-NEXT: store i8** getelementptr inbounds ([4 x i8*]* @_ZTVN12rdar138169401AE, i64 0, i64 2), i8*** [[T0]]
> +// CHECK-NEXT: [[T0:%.*]] = bitcast [[A]]* [[THIS]] to i32 (...)***
> +// CHECK-NEXT: store i32 (...)** bitcast (i8** getelementptr inbounds ([4 x i8*]* @_ZTVN12rdar138169401AE, i64 0, i64 2) to i32 (...)**), i32 (...)*** [[T0]]
>  // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[A]]* [[THIS]], i32 0, i32 1
>  // CHECK-NEXT: [[OTHER:%.*]] = load [[A]]**
>  // CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [[A]]* [[OTHER]], i32 0, i32 1
>
> Added: cfe/trunk/test/CodeGenCXX/ctor-globalopt.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/ctor-globalopt.cpp?rev=223267&view=auto
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/ctor-globalopt.cpp (added)
> +++ cfe/trunk/test/CodeGenCXX/ctor-globalopt.cpp Wed Dec  3 15:00:21 2014
> @@ -0,0 +1,28 @@
> +// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -o - %s | FileCheck %s
> +// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -o - %s -O1 | FileCheck %s --check-prefix=O1
> +// RUN: %clang_cc1 -triple %ms_abi_triple -emit-llvm -o - %s | FileCheck %s
> +// RUN: %clang_cc1 -triple %ms_abi_triple -emit-llvm -o - %s -O1 | FileCheck %s --check-prefix=O1
> +
> +// Check that GlobalOpt can eliminate static constructors for simple implicit
> +// constructors. This is a targetted integration test to make sure that LLVM's
> +// optimizers are able to process Clang's IR. GlobalOpt in particular is
> +// sensitive to the casts we emit.
> +
> +// CHECK: @llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }]
> +// CHECK: [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__sub_I_ctor_globalopt.cpp, i8* null }]
> +
> +// CHECK-LABEL: define internal void @_GLOBAL__sub_I_ctor_globalopt.cpp()
> +// CHECK: call void @
> +// CHECK-NOT: call
> +
> +// O1: @llvm.global_ctors = appending global [0 x { i32, void ()*, i8* }] zeroinitializer
> +
> +struct A {
> +  virtual void f();
> +  int a;
> +};
> +struct B : virtual A {
> +  virtual void g();
> +  int b;
> +};
> +B b;
>
> Modified: cfe/trunk/test/CodeGenCXX/microsoft-abi-multiple-nonvirtual-inheritance.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/microsoft-abi-multiple-nonvirtual-inheritance.cpp?rev=223267&r1=223266&r2=223267&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/microsoft-abi-multiple-nonvirtual-inheritance.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/microsoft-abi-multiple-nonvirtual-inheritance.cpp Wed Dec  3 15:00:21 2014
> @@ -150,35 +150,35 @@ void emit_ctors() {
>    Left l;
>    // CHECK: define {{.*}} @"\01??0Left@@QAE at XZ"
>    // CHECK-NOT: getelementptr
> -  // CHECK:   store [1 x i8*]* @"\01??_7Left@@6B@"
> +  // CHECK:   store i32 (...)** bitcast ([1 x i8*]* @"\01??_7Left@@6B@" to i32 (...)**)
>    // CHECK: ret
>
>    Right r;
>    // CHECK: define {{.*}} @"\01??0Right@@QAE at XZ"
>    // CHECK-NOT: getelementptr
> -  // CHECK:   store [1 x i8*]* @"\01??_7Right@@6B@"
> +  // CHECK:   store i32 (...)** bitcast ([1 x i8*]* @"\01??_7Right@@6B@" to i32 (...)**)
>    // CHECK: ret
>
>    ChildOverride co;
>    // CHECK: define {{.*}} @"\01??0ChildOverride@@QAE at XZ"
>    // CHECK:   %[[THIS:.*]] = load %struct.ChildOverride**
> -  // CHECK:   %[[VFPTR:.*]] = bitcast %struct.ChildOverride* %[[THIS]] to [1 x i8*]**
> -  // CHECK:   store [1 x i8*]* @"\01??_7ChildOverride@@6BLeft@@@", [1 x i8*]** %[[VFPTR]]
> +  // CHECK:   %[[VFPTR:.*]] = bitcast %struct.ChildOverride* %[[THIS]] to i32 (...)***
> +  // CHECK:   store i32 (...)** bitcast ([1 x i8*]* @"\01??_7ChildOverride@@6BLeft@@@" to i32 (...)**), i32 (...)*** %[[VFPTR]]
>    // CHECK:   %[[THIS_i8:.*]] = bitcast %struct.ChildOverride* %[[THIS]] to i8*
>    // CHECK:   %[[VFPTR_i8:.*]] = getelementptr inbounds i8* %[[THIS_i8]], i32 4
> -  // CHECK:   %[[VFPTR:.*]] = bitcast i8* %[[VFPTR_i8]] to [1 x i8*]**
> -  // CHECK:   store [1 x i8*]* @"\01??_7ChildOverride@@6BRight@@@", [1 x i8*]** %[[VFPTR]]
> +  // CHECK:   %[[VFPTR:.*]] = bitcast i8* %[[VFPTR_i8]] to i32 (...)***
> +  // CHECK:   store i32 (...)** bitcast ([1 x i8*]* @"\01??_7ChildOverride@@6BRight@@@" to i32 (...)**), i32 (...)*** %[[VFPTR]]
>    // CHECK: ret
>
>    GrandchildOverride gc;
>    // CHECK: define {{.*}} @"\01??0GrandchildOverride@@QAE at XZ"
>    // CHECK:   %[[THIS:.*]] = load %struct.GrandchildOverride**
> -  // CHECK:   %[[VFPTR:.*]] = bitcast %struct.GrandchildOverride* %[[THIS]] to [1 x i8*]**
> -  // CHECK:   store [1 x i8*]* @"\01??_7GrandchildOverride@@6BLeft@@@", [1 x i8*]** %[[VFPTR]]
> +  // CHECK:   %[[VFPTR:.*]] = bitcast %struct.GrandchildOverride* %[[THIS]] to i32 (...)***
> +  // CHECK:   store i32 (...)** bitcast ([1 x i8*]* @"\01??_7GrandchildOverride@@6BLeft@@@" to i32 (...)**), i32 (...)*** %[[VFPTR]]
>    // CHECK:   %[[THIS_i8:.*]] = bitcast %struct.GrandchildOverride* %[[THIS]] to i8*
>    // CHECK:   %[[VFPTR_i8:.*]] = getelementptr inbounds i8* %[[THIS_i8]], i32 4
> -  // CHECK:   %[[VFPTR:.*]] = bitcast i8* %[[VFPTR_i8]] to [1 x i8*]**
> -  // CHECK:   store [1 x i8*]* @"\01??_7GrandchildOverride@@6BRight@@@", [1 x i8*]** %[[VFPTR]]
> +  // CHECK:   %[[VFPTR:.*]] = bitcast i8* %[[VFPTR_i8]] to i32 (...)***
> +  // CHECK:   store i32 (...)** bitcast ([1 x i8*]* @"\01??_7GrandchildOverride@@6BRight@@@" to i32 (...)**), i32 (...)*** %[[VFPTR]]
>    // CHECK: ret
>  }
>
>
> Modified: cfe/trunk/test/CodeGenCXX/microsoft-abi-structors.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/microsoft-abi-structors.cpp?rev=223267&r1=223266&r2=223267&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/microsoft-abi-structors.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/microsoft-abi-structors.cpp Wed Dec  3 15:00:21 2014
> @@ -75,8 +75,8 @@ void C::foo() {}
>  void check_vftable_offset() {
>    C c;
>  // The vftable pointer should point at the beginning of the vftable.
> -// CHECK: [[THIS_PTR:%[0-9]+]] = bitcast %"struct.basic::C"* {{.*}} to [2 x i8*]**
> -// CHECK: store [2 x i8*]* @"\01??_7C at basic@@6B@", [2 x i8*]** [[THIS_PTR]]
> +// CHECK: [[THIS_PTR:%[0-9]+]] = bitcast %"struct.basic::C"* {{.*}} to i32 (...)***
> +// CHECK: store i32 (...)** bitcast ([2 x i8*]* @"\01??_7C at basic@@6B@" to i32 (...)**), i32 (...)*** [[THIS_PTR]]
>  }
>
>  void call_complete_dtor(C *obj_ptr) {
>
> Modified: cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-inheritance.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-inheritance.cpp?rev=223267&r1=223266&r2=223267&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-inheritance.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-inheritance.cpp Wed Dec  3 15:00:21 2014
> @@ -32,8 +32,8 @@ B::B() {
>    // ...
>    // CHECK:   %[[THIS_i8:.*]] = bitcast %struct.B* %[[THIS]] to i8*
>    // CHECK:   %[[VFPTR_i8:.*]] = getelementptr inbounds i8* %[[THIS_i8]], i32 %{{.*}}
> -  // CHECK:   %[[VFPTR:.*]] = bitcast i8* %[[VFPTR_i8]] to [3 x i8*]**
> -  // CHECK:   store [3 x i8*]* @"\01??_7B@@6B@", [3 x i8*]** %[[VFPTR]]
> +  // CHECK:   %[[VFPTR:.*]] = bitcast i8* %[[VFPTR_i8]] to i32 (...)***
> +  // CHECK:   store i32 (...)** bitcast ([3 x i8*]* @"\01??_7B@@6B@" to i32 (...)**), i32 (...)*** %[[VFPTR]]
>
>    // Initialize vtorDisp:
>    // CHECK:   %[[THIS_i8:.*]] = bitcast %struct.B* %[[THIS]] to i8*
> @@ -65,8 +65,8 @@ B::~B() {
>    // ...
>    // CHECK:   %[[THIS_i8:.*]] = bitcast %struct.B* %[[THIS]] to i8*
>    // CHECK:   %[[VFPTR_i8:.*]] = getelementptr inbounds i8* %[[THIS_i8]], i32 %{{.*}}
> -  // CHECK:   %[[VFPTR:.*]] = bitcast i8* %[[VFPTR_i8]] to [3 x i8*]**
> -  // CHECK:   store [3 x i8*]* @"\01??_7B@@6B@", [3 x i8*]** %[[VFPTR]]
> +  // CHECK:   %[[VFPTR:.*]] = bitcast i8* %[[VFPTR_i8]] to i32 (...)***
> +  // CHECK:   store i32 (...)** bitcast ([3 x i8*]* @"\01??_7B@@6B@" to i32 (...)**), i32 (...)*** %[[VFPTR]]
>
>    // Initialize vtorDisp:
>    // CHECK:   %[[THIS_i8:.*]] = bitcast %struct.B* %[[THIS]] to i8*
> @@ -245,9 +245,9 @@ struct D : virtual A, virtual B, virtual
>  D::D() {
>    // CHECK-LABEL: define x86_thiscallcc %"struct.multiple_vbases::D"* @"\01??0D at multiple_vbases@@QAE at XZ"
>    // Just make sure we emit 3 vtordisps after initializing vfptrs.
> -  // CHECK: store [1 x i8*]* @"\01??_7D at multiple_vbases@@6BA at 1@@", [1 x i8*]** %{{.*}}
> -  // CHECK: store [1 x i8*]* @"\01??_7D at multiple_vbases@@6BB at 1@@", [1 x i8*]** %{{.*}}
> -  // CHECK: store [1 x i8*]* @"\01??_7D at multiple_vbases@@6BC at 1@@", [1 x i8*]** %{{.*}}
> +  // CHECK: store i32 (...)** bitcast ([1 x i8*]* @"\01??_7D at multiple_vbases@@6BA at 1@@" to i32 (...)**), i32 (...)*** %{{.*}}
> +  // CHECK: store i32 (...)** bitcast ([1 x i8*]* @"\01??_7D at multiple_vbases@@6BB at 1@@" to i32 (...)**), i32 (...)*** %{{.*}}
> +  // CHECK: store i32 (...)** bitcast ([1 x i8*]* @"\01??_7D at multiple_vbases@@6BC at 1@@" to i32 (...)**), i32 (...)*** %{{.*}}
>    // ...
>    // CHECK: store i32 %{{.*}}, i32* %{{.*}}
>    // CHECK: store i32 %{{.*}}, i32* %{{.*}}
> @@ -396,8 +396,8 @@ C::~C() {
>    // In this case "this" points to the most derived class, so no GEPs needed.
>    // CHECK-NOT: getelementptr
>    // CHECK-NOT: bitcast
> -  // CHECK: %[[VFPTR_i8:.*]] = bitcast %"struct.test4::C"* %{{.*}} to [1 x i8*]**
> -  // CHECK: store [1 x i8*]* @"\01??_7C at test4@@6BB at 1@@", [1 x i8*]** %[[VFPTR_i8]]
> +  // CHECK: %[[VFPTR_i8:.*]] = bitcast %"struct.test4::C"* %{{.*}} to i32 (...)***
> +  // CHECK: store i32 (...)** bitcast ([1 x i8*]* @"\01??_7C at test4@@6BB at 1@@" to i32 (...)**), i32 (...)*** %[[VFPTR_i8]]
>
>    foo(this);
>    // CHECK: ret
> @@ -431,8 +431,8 @@ E::~E() {
>    // In this case "this" points to the most derived class, so no GEPs needed.
>    // CHECK-NOT: getelementptr
>    // CHECK-NOT: bitcast
> -  // CHECK: %[[VFPTR_i8:.*]] = bitcast %"struct.test4::E"* %{{.*}} to [1 x i8*]**
> -  // CHECK: store [1 x i8*]* @"\01??_7E at test4@@6BD at 1@@", [1 x i8*]** %[[VFPTR_i8]]
> +  // CHECK: %[[VFPTR_i8:.*]] = bitcast %"struct.test4::E"* %{{.*}} to i32 (...)***
> +  // CHECK: store i32 (...)** bitcast ([1 x i8*]* @"\01??_7E at test4@@6BD at 1@@" to i32 (...)**), i32 (...)*** %[[VFPTR_i8]]
>    foo(this);
>  }
>
>
> Modified: cfe/trunk/test/CodeGenCXX/microsoft-interface.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/microsoft-interface.cpp?rev=223267&r1=223266&r2=223267&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/microsoft-interface.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/microsoft-interface.cpp Wed Dec  3 15:00:21 2014
> @@ -34,7 +34,7 @@ int fn() {
>
>  // CHECK-LABEL: define linkonce_odr x86_thiscallcc void @_ZN1SC2Ev(%struct.S* %this)
>  // CHECK:   call x86_thiscallcc void @_ZN1IC2Ev(%__interface.I* %{{[.0-9A-Z_a-z]+}})
> -// CHECK:   store i8** getelementptr inbounds ([3 x i8*]* @_ZTV1S, i64 0, i64 2), i8*** %{{[.0-9A-Z_a-z]+}}
> +// CHECK:   store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @_ZTV1S, i64 0, i64 2) to i32 (...)**), i32 (...)*** %{{[.0-9A-Z_a-z]+}}
>
>  // CHECK-LABEL: define linkonce_odr x86_thiscallcc void @_ZN1IC2Ev(%__interface.I* %this)
> -// CHECK:   store i8** getelementptr inbounds ([3 x i8*]* @_ZTV1I, i64 0, i64 2), i8*** %{{[.0-9A-Z_a-z]+}}
> +// CHECK:   store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @_ZTV1I, i64 0, i64 2) to i32 (...)**), i32 (...)*** %{{[.0-9A-Z_a-z]+}}
>
> Modified: cfe/trunk/test/CodeGenCXX/skip-vtable-pointer-initialization.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/skip-vtable-pointer-initialization.cpp?rev=223267&r1=223266&r2=223267&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/skip-vtable-pointer-initialization.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/skip-vtable-pointer-initialization.cpp Wed Dec  3 15:00:21 2014
> @@ -11,7 +11,7 @@ struct A {
>  };
>
>  // CHECK-LABEL: define void @_ZN5Test11AD2Ev
> -// CHECK-NOT: store i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test11AE, i64 0, i64 2), i8***
> +// CHECK-NOT: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test11AE, i64 0, i64 2) to i32 (...)**), i32 (...)***
>  A::~A()
>  {
>  }
> @@ -27,7 +27,7 @@ struct A {
>  };
>
>  // CHECK-LABEL: define void @_ZN5Test21AD2Ev
> -// CHECK: store i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test21AE, i64 0, i64 2), i8***
> +// CHECK: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test21AE, i64 0, i64 2) to i32 (...)**), i32 (...)***
>  A::~A() {
>    f();
>  }
> @@ -50,7 +50,7 @@ struct A {
>  };
>
>  // CHECK-LABEL: define void @_ZN5Test31AD2Ev
> -// CHECK-NOT: store i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test31AE, i64 0, i64 2), i8***
> +// CHECK-NOT: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test31AE, i64 0, i64 2) to i32 (...)**), i32 (...)***
>  A::~A() {
>
>  }
> @@ -76,7 +76,7 @@ struct A {
>  };
>
>  // CHECK-LABEL: define void @_ZN5Test41AD2Ev
> -// CHECK: store i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test41AE, i64 0, i64 2), i8***
> +// CHECK: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test41AE, i64 0, i64 2) to i32 (...)**), i32 (...)***
>  A::~A()
>  {
>  }
> @@ -100,7 +100,7 @@ struct A {
>  };
>
>  // CHECK-LABEL: define void @_ZN5Test51AD2Ev
> -// CHECK: store i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test51AE, i64 0, i64 2), i8***
> +// CHECK: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test51AE, i64 0, i64 2) to i32 (...)**), i32 (...)***
>  A::~A()
>  {
>  }
> @@ -128,7 +128,7 @@ struct A {
>  };
>
>  // CHECK-LABEL: define void @_ZN5Test61AD2Ev
> -// CHECK: store i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test61AE, i64 0, i64 2), i8***
> +// CHECK: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test61AE, i64 0, i64 2) to i32 (...)**), i32 (...)***
>  A::~A()
>  {
>  }
> @@ -154,7 +154,7 @@ struct A {
>  };
>
>  // CHECK-LABEL: define void @_ZN5Test71AD2Ev
> -// CHECK: store i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test71AE, i64 0, i64 2), i8***
> +// CHECK: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test71AE, i64 0, i64 2) to i32 (...)**), i32 (...)***
>  A::~A()
>  {
>  }
> @@ -180,7 +180,7 @@ struct A {
>  };
>
>  // CHECK-LABEL: define void @_ZN5Test81AD2Ev
> -// CHECK: store i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test81AE, i64 0, i64 2), i8***
> +// CHECK: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @_ZTVN5Test81AE, i64 0, i64 2) to i32 (...)**), i32 (...)***
>  A::~A()
>  {
>  }
>
> Modified: cfe/trunk/test/CodeGenCXX/vtable-pointer-initialization.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/vtable-pointer-initialization.cpp?rev=223267&r1=223266&r2=223267&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/vtable-pointer-initialization.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/vtable-pointer-initialization.cpp Wed Dec  3 15:00:21 2014
> @@ -21,13 +21,13 @@ struct A : Base {
>
>  // CHECK-LABEL: define void @_ZN1AC2Ev(%struct.A* %this) unnamed_addr
>  // CHECK: call void @_ZN4BaseC2Ev(
> -// CHECK: store i8** getelementptr inbounds ([3 x i8*]* @_ZTV1A, i64 0, i64 2)
> +// CHECK: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @_ZTV1A, i64 0, i64 2) to i32 (...)**)
>  // CHECK: call void @_ZN5FieldC1Ev(
>  // CHECK: ret void
>  A::A() { }
>
>  // CHECK-LABEL: define void @_ZN1AD2Ev(%struct.A* %this) unnamed_addr
> -// CHECK: store i8** getelementptr inbounds ([3 x i8*]* @_ZTV1A, i64 0, i64 2)
> +// CHECK: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @_ZTV1A, i64 0, i64 2) to i32 (...)**)
>  // CHECK: call void @_ZN5FieldD1Ev(
>  // CHECK: call void @_ZN4BaseD2Ev(
>  // CHECK: ret void
> @@ -45,13 +45,13 @@ void f() { B b; }
>  // CHECK: call void @_ZN1BC2Ev(
>
>  // CHECK-LABEL: define linkonce_odr void @_ZN1BD1Ev(%struct.B* %this) unnamed_addr
> -// CHECK: store i8** getelementptr inbounds ([3 x i8*]* @_ZTV1B, i64 0, i64 2)
> +// CHECK: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @_ZTV1B, i64 0, i64 2) to i32 (...)**)
>  // CHECK: call void @_ZN5FieldD1Ev(
>  // CHECK: call void @_ZN4BaseD2Ev(
>  // CHECK: ret void
>
>  // CHECK-LABEL: define linkonce_odr void @_ZN1BC2Ev(%struct.B* %this) unnamed_addr
>  // CHECK: call void @_ZN4BaseC2Ev(
> -// CHECK: store i8** getelementptr inbounds ([3 x i8*]* @_ZTV1B, i64 0, i64 2)
> +// CHECK: store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*]* @_ZTV1B, i64 0, i64 2) to i32 (...)**)
>  // CHECK: call void @_ZN5FieldC1Ev
>  // CHECK: 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