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