Author: Erich Keane
Date: 2026-08-16T20:14:41-07:00
New Revision: 9cd4a3d4eeadf8f69b32f7b88bdcea480aab60ed

URL: 
https://github.com/llvm/llvm-project/commit/9cd4a3d4eeadf8f69b32f7b88bdcea480aab60ed
DIFF: 
https://github.com/llvm/llvm-project/commit/9cd4a3d4eeadf8f69b32f7b88bdcea480aab60ed.diff

LOG: [CIR] Fix the 'constant'-ness of vtable-variables (#216434)

The createOrReplaceCXXRuntimeVariable sets the variable to be 'constant'
in classic codegen, this sets that right. However, 1 use of it (in
buildVTablePointer) doesn't match classic-codegen (it instead calls
getOrInsertGlobal directly), so this patch adds a bit of a fixup there
to minimize the impact of this change.

Added: 
    

Modified: 
    clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp
    clang/lib/CIR/CodeGen/CIRGenModule.cpp
    clang/test/CIR/CodeGen/multi-vtable.cpp
    clang/test/CIR/CodeGen/pointer-width-32bit.cpp
    clang/test/CIR/CodeGen/rtti-member-pointer.cpp
    clang/test/CIR/CodeGen/rtti-qualfn.cpp
    clang/test/CIR/CodeGen/thunks.cpp
    clang/test/CIR/CodeGen/vbase.cpp
    clang/test/CIR/CodeGen/virtual-function-calls.cpp
    clang/test/CIR/CodeGen/vtable-emission.cpp
    clang/test/CIR/CodeGen/vtable-linkage-explicit-instantiation.cpp
    clang/test/CIR/CodeGen/vtt.cpp
    clang/test/CIR/CodeGenCXX/vtable-linkage.cpp
    clang/test/CIR/CodeGenCXX/vtable-pure-deleted-funcs.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp 
b/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp
index 1e3c4d4ddcfeb..800f20ace0e70 100644
--- a/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp
@@ -1235,6 +1235,11 @@ void 
CIRGenItaniumRTTIBuilder::buildVTablePointer(mlir::Location loc,
   cir::GlobalOp vTable = cgm.createOrReplaceCXXRuntimeVariable(
       loc, vTableName, vtableGlobalTy, cir::GlobalLinkageKind::ExternalLinkage,
       CharUnits::fromQuantity(align));
+  // Note: createOrReplaceCXXRuntimeVariable isn't exactly what classic-codegen
+  // does here: it just does a getOrInsertGlobal at the module level. However,
+  // the above function does MOST of what we want, except it sets the global as
+  // constant, when we don't want that.  So set it here instead.
+  vTable.setConstant(false);
 
   // The vtable address point is 2.
   mlir::Attribute field{};

diff  --git a/clang/lib/CIR/CodeGen/CIRGenModule.cpp 
b/clang/lib/CIR/CodeGen/CIRGenModule.cpp
index 16254d1bdba91..7d8c54cbfb1d8 100644
--- a/clang/lib/CIR/CodeGen/CIRGenModule.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenModule.cpp
@@ -1879,7 +1879,7 @@ cir::GlobalOp 
CIRGenModule::createOrReplaceCXXRuntimeVariable(
   }
 
   // Create a new variable.
-  gv = createGlobalOp(loc, name, ty);
+  gv = createGlobalOp(loc, name, ty, /*isConstant=*/true);
 
   // Set up extra information and add to the module
   gv.setLinkageAttr(

diff  --git a/clang/test/CIR/CodeGen/multi-vtable.cpp 
b/clang/test/CIR/CodeGen/multi-vtable.cpp
index fd51c6bf80807..33980b459886e 100644
--- a/clang/test/CIR/CodeGen/multi-vtable.cpp
+++ b/clang/test/CIR/CodeGen/multi-vtable.cpp
@@ -39,7 +39,7 @@ void Child::MotherKey() {}
 
 // Child vtable
 
-// CIR:      cir.global "private" external @_ZTV5Child = #cir.vtable<{
+// CIR:      cir.global "private" constant external @_ZTV5Child = #cir.vtable<{
 // CIR-SAME:     #cir.const_array<[
 // CIR-SAME:         #cir.ptr<null> : !cir.ptr<!u8i>,
 // CIR-SAME:         #cir.ptr<null> : !cir.ptr<!u8i>,
@@ -53,7 +53,7 @@ void Child::MotherKey() {}
 // CIR-SAME:     ]> : !cir.array<!cir.ptr<!u8i> x 3>
 // CIR-SAME: }> : [[CHILD_VTABLE_TYPE]]
 
-// LLVM:      @_ZTV5Child = global { [4 x ptr], [3 x ptr] } {
+// LLVM:      @_ZTV5Child = constant { [4 x ptr], [3 x ptr] } {
 // LLVM-SAME:     [4 x ptr] [
 // LLVM-SAME:         ptr null,
 // LLVM-SAME:         ptr null,
@@ -83,7 +83,7 @@ void Child::MotherKey() {}
 
 // Mother vtable
 
-// CIR:      cir.global "private" external @_ZTV6Mother = #cir.vtable<{
+// CIR:      cir.global "private" constant external @_ZTV6Mother = 
#cir.vtable<{
 // CIR-SAME:      #cir.const_array<[
 // CIR-SAME:          #cir.ptr<null> : !cir.ptr<!u8i>,
 // CIR-SAME:          #cir.ptr<null> : !cir.ptr<!u8i>,
@@ -92,7 +92,7 @@ void Child::MotherKey() {}
 // CIR-SAME:      ]> : !cir.array<!cir.ptr<!u8i> x 4>
 // CIR-SAME: }> : [[MOTHER_VTABLE_TYPE]]
 
-// LLVM:      @_ZTV6Mother = global { [4 x ptr] } {
+// LLVM:      @_ZTV6Mother = constant { [4 x ptr] } {
 // LLVM-SAME:     [4 x ptr] [
 // LLVM-SAME:         ptr null,
 // LLVM-SAME:         ptr null,
@@ -112,7 +112,7 @@ void Child::MotherKey() {}
 
 // Father vtable
 
-// CIR:      cir.global "private" external @_ZTV6Father = #cir.vtable<{
+// CIR:      cir.global "private" constant external @_ZTV6Father = 
#cir.vtable<{
 // CIR-SAME:     #cir.const_array<[
 // CIR-SAME:         #cir.ptr<null> : !cir.ptr<!u8i>,
 // CIR-SAME:         #cir.ptr<null> : !cir.ptr<!u8i>,
@@ -120,7 +120,7 @@ void Child::MotherKey() {}
 // CIR-SAME:     ]> : !cir.array<!cir.ptr<!u8i> x 3>
 // CIR-SAME: }> : [[FATHER_VTABLE_TYPE]]
 
-// LLVM:      @_ZTV6Father = global { [3 x ptr] } {
+// LLVM:      @_ZTV6Father = constant { [3 x ptr] } {
 // LLVM-SAME:     [3 x ptr] [
 // LLVM-SAME:         ptr null,
 // LLVM-SAME:         ptr null,

diff  --git a/clang/test/CIR/CodeGen/pointer-width-32bit.cpp 
b/clang/test/CIR/CodeGen/pointer-width-32bit.cpp
index f811fdc5361fb..6715c5680ce24 100644
--- a/clang/test/CIR/CodeGen/pointer-width-32bit.cpp
+++ b/clang/test/CIR/CodeGen/pointer-width-32bit.cpp
@@ -47,7 +47,7 @@ M m;
 
 // LLVM: @s = global %struct.S zeroinitializer, align 4
 // LLVM: @m = global %struct.M { i32 -1, i32 0 }, align 4
-// LLVM: @_ZTV1A = global { [3 x ptr] } {{.*}}, align 4
+// LLVM: @_ZTV1A = constant { [3 x ptr] } {{.*}}, align 4
 
 // OGCG: @s = global %struct.S zeroinitializer, align 4
 // OGCG: @m = global %struct.M { i32 -1, i32 0 }, align 4

diff  --git a/clang/test/CIR/CodeGen/rtti-member-pointer.cpp 
b/clang/test/CIR/CodeGen/rtti-member-pointer.cpp
index b223857a9630c..a041db2cab628 100644
--- a/clang/test/CIR/CodeGen/rtti-member-pointer.cpp
+++ b/clang/test/CIR/CodeGen/rtti-member-pointer.cpp
@@ -23,8 +23,8 @@ void throw_data_member_ptr() {
 
 // CIR-DAG: cir.throw %{{.*}} : !cir.ptr<!s64i>, @_ZTIM1Ai
 
-// LLVM-DAG: @_ZTSM1Ai = linkonce_odr global [5 x i8] c"M1Ai\00", comdat
-// LLVM-DAG: @_ZTS1A = linkonce_odr global [3 x i8] c"1A\00", comdat
+// LLVM-DAG: @_ZTSM1Ai = linkonce_odr constant [5 x i8] c"M1Ai\00", comdat
+// LLVM-DAG: @_ZTS1A = linkonce_odr constant [3 x i8] c"1A\00", comdat
 // LLVM-DAG: @_ZTI1A = linkonce_odr constant { ptr, ptr } { ptr getelementptr 
(i8, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 16), ptr @_ZTS1A }, comdat
 // LLVM-DAG: @_ZTIM1Ai = linkonce_odr constant { ptr, ptr, i32, ptr, ptr } { 
ptr getelementptr (i8, ptr @_ZTVN10__cxxabiv129__pointer_to_member_type_infoE, 
i64 16), ptr @_ZTSM1Ai, i32 0, ptr @_ZTIi, ptr @_ZTI1A }, comdat
 // LLVM-DAG: call void @__cxa_throw(ptr %{{.*}}, ptr @_ZTIM1Ai, ptr null)
@@ -45,8 +45,8 @@ void throw_member_fn_ptr() {
 // CIR-DAG: cir.global {{.*}} @_ZTIFvvE = 
#cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv120__function_type_infoE, [2 : 
i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTSFvvE> : !cir.ptr<!u8i>}>
 // CIR-DAG: cir.global {{.*}} @_ZTIM1AFvvE = 
#cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv129__pointer_to_member_type_infoE,
 [2 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTSM1AFvvE> : !cir.ptr<!u8i>, 
#cir.int<0> : !u32i, #cir.global_view<@_ZTIFvvE> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1A> : !cir.ptr<!u8i>}>
 
-// LLVM-DAG: @_ZTSM1AFvvE = linkonce_odr global [8 x i8] c"M1AFvvE\00", comdat
-// LLVM-DAG: @_ZTSFvvE = linkonce_odr global [5 x i8] c"FvvE\00", comdat
+// LLVM-DAG: @_ZTSM1AFvvE = linkonce_odr constant [8 x i8] c"M1AFvvE\00", 
comdat
+// LLVM-DAG: @_ZTSFvvE = linkonce_odr constant [5 x i8] c"FvvE\00", comdat
 // LLVM-DAG: @_ZTIFvvE = linkonce_odr constant { ptr, ptr } { ptr 
getelementptr (i8, ptr @_ZTVN10__cxxabiv120__function_type_infoE, i64 16), ptr 
@_ZTSFvvE }, comdat
 // LLVM-DAG: @_ZTIM1AFvvE = linkonce_odr constant { ptr, ptr, i32, ptr, ptr } 
{ ptr getelementptr (i8, ptr 
@_ZTVN10__cxxabiv129__pointer_to_member_type_infoE, i64 16), ptr @_ZTSM1AFvvE, 
i32 0, ptr @_ZTIFvvE, ptr @_ZTI1A }, comdat
 // LLVM-DAG: call void @__cxa_throw(ptr %{{.*}}, ptr @_ZTIM1AFvvE, ptr null)

diff  --git a/clang/test/CIR/CodeGen/rtti-qualfn.cpp 
b/clang/test/CIR/CodeGen/rtti-qualfn.cpp
index d57e7fce7915f..639bc1bac92b3 100644
--- a/clang/test/CIR/CodeGen/rtti-qualfn.cpp
+++ b/clang/test/CIR/CodeGen/rtti-qualfn.cpp
@@ -23,9 +23,9 @@ void f() noexcept {
 
 // CIR: cir.throw %{{.*}} : !cir.ptr<!cir.ptr<!cir.func<()>>>, @_ZTIPDoFvvE
 
-// LLVM-DAG: @_ZTSFvvE = linkonce_odr global [5 x i8] c"FvvE\00", comdat
+// LLVM-DAG: @_ZTSFvvE = linkonce_odr constant [5 x i8] c"FvvE\00", comdat
 // LLVM-DAG: @_ZTIFvvE = linkonce_odr constant { ptr, ptr } { ptr 
getelementptr (i8, ptr @_ZTVN10__cxxabiv120__function_type_infoE, i64 16), ptr 
@_ZTSFvvE }, comdat
-// LLVM-DAG: @_ZTSPDoFvvE = linkonce_odr global [8 x i8] c"PDoFvvE\00", comdat
+// LLVM-DAG: @_ZTSPDoFvvE = linkonce_odr constant [8 x i8] c"PDoFvvE\00", 
comdat
 // LLVM-DAG: @_ZTIPDoFvvE = linkonce_odr constant { ptr, ptr, i32, ptr } { ptr 
getelementptr (i8, ptr @_ZTVN10__cxxabiv119__pointer_type_infoE, i64 16), ptr 
@_ZTSPDoFvvE, i32 64, ptr @_ZTIFvvE }, comdat
 // LLVM: call void @__cxa_throw(ptr %{{.*}}, ptr @_ZTIPDoFvvE, ptr null)
 

diff  --git a/clang/test/CIR/CodeGen/thunks.cpp 
b/clang/test/CIR/CodeGen/thunks.cpp
index 5ec846350d115..3fa329f02ffc9 100644
--- a/clang/test/CIR/CodeGen/thunks.cpp
+++ b/clang/test/CIR/CodeGen/thunks.cpp
@@ -151,28 +151,28 @@ void C::f(int x, ...) {}
 // In CIR, all globals are emitted before functions.
 
 // Test1 vtable: C's vtable references the thunk for B's entry.
-// CIR-DAG: cir.global "private" external @_ZTVN5Test11CE = #cir.vtable<{
+// CIR-DAG: cir.global "private" constant external @_ZTVN5Test11CE = 
#cir.vtable<{
 // CIR-DAG:   #cir.global_view<@_ZN5Test11C1fEv> : !cir.ptr<!u8i>
 // CIR-DAG:   #cir.global_view<@_ZThn8_N5Test11C1fEv> : !cir.ptr<!u8i>
 
 // Test2 vtable: C's vtable references the thunk for B's entry.
-// CIR-DAG: cir.global "private" external @_ZTVN5Test21CE = #cir.vtable<{
+// CIR-DAG: cir.global "private" constant external @_ZTVN5Test21CE = 
#cir.vtable<{
 // CIR-DAG:   #cir.global_view<@_ZN5Test21C1gEv> : !cir.ptr<!u8i>
 // CIR-DAG:   #cir.global_view<@_ZThn8_N5Test21C1gEv> : !cir.ptr<!u8i>
 
 // Test5 vtable: C's vtable references the aggregate-return thunk for B's
 // entry.
-// CIR-DAG: cir.global "private" external @_ZTVN5Test51CE = #cir.vtable<{
+// CIR-DAG: cir.global "private" constant external @_ZTVN5Test51CE = 
#cir.vtable<{
 // CIR-DAG:   #cir.global_view<@_ZN5Test51C1hEv> : !cir.ptr<!u8i>
 // CIR-DAG:   #cir.global_view<@_ZThn8_N5Test51C1hEv> : !cir.ptr<!u8i>
 
 // Test4 vtable: C's vtable references the thunk for B's entry.
-// CIR-DAG: cir.global "private" external @_ZTVN5Test41CE = #cir.vtable<{
+// CIR-DAG: cir.global "private" constant external @_ZTVN5Test41CE = 
#cir.vtable<{
 // CIR-DAG:   #cir.global_view<@_ZN5Test41C1gEi> : !cir.ptr<!u8i>
 // CIR-DAG:   #cir.global_view<@_ZThn8_N5Test41C1gEi> : !cir.ptr<!u8i>
 
 // Test3 vtable: D's vtable references D1, D0, and their thunks.
-// CIR-DAG: cir.global "private" external @_ZTVN5Test31DE = #cir.vtable<{
+// CIR-DAG: cir.global "private" constant external @_ZTVN5Test31DE = 
#cir.vtable<{
 // CIR-DAG:   #cir.global_view<@_ZN5Test31DD1Ev> : !cir.ptr<!u8i>
 // CIR-DAG:   #cir.global_view<@_ZN5Test31DD0Ev> : !cir.ptr<!u8i>
 // CIR-DAG:   #cir.global_view<@_ZThn8_N5Test31DD1Ev> : !cir.ptr<!u8i>
@@ -282,27 +282,27 @@ void C::f(int x, ...) {}
 
 // --- LLVM checks ---
 
-// LLVM: @_ZTVN5Test11CE = global { [3 x ptr], [3 x ptr] } {
+// LLVM: @_ZTVN5Test11CE = constant { [3 x ptr], [3 x ptr] } {
 // LLVM-SAME: [3 x ptr] [ptr null, ptr null, ptr @_ZN5Test11C1fEv],
 // LLVM-SAME: [3 x ptr] [ptr inttoptr (i64 -8 to ptr), ptr null, ptr 
@_ZThn8_N5Test11C1fEv]
 // LLVM-SAME: }
 
-// LLVM: @_ZTVN5Test21CE = global { [3 x ptr], [3 x ptr] } {
+// LLVM: @_ZTVN5Test21CE = constant { [3 x ptr], [3 x ptr] } {
 // LLVM-SAME: [3 x ptr] [ptr null, ptr null, ptr @_ZN5Test21C1gEv],
 // LLVM-SAME: [3 x ptr] [ptr inttoptr (i64 -8 to ptr), ptr null, ptr 
@_ZThn8_N5Test21C1gEv]
 // LLVM-SAME: }
 
-// LLVM: @_ZTVN5Test31DE = global { [4 x ptr], [4 x ptr] } {
+// LLVM: @_ZTVN5Test31DE = constant { [4 x ptr], [4 x ptr] } {
 // LLVM-SAME: [4 x ptr] [ptr null, ptr null, ptr @_ZN5Test31DD1Ev, ptr 
@_ZN5Test31DD0Ev],
 // LLVM-SAME: [4 x ptr] [ptr inttoptr (i64 -8 to ptr), ptr null, ptr 
@_ZThn8_N5Test31DD1Ev, ptr @_ZThn8_N5Test31DD0Ev]
 // LLVM-SAME: }
 
-// LLVM: @_ZTVN5Test41CE = global { [4 x ptr], [3 x ptr] } {
+// LLVM: @_ZTVN5Test41CE = constant { [4 x ptr], [3 x ptr] } {
 // LLVM-SAME: [4 x ptr] [ptr null, ptr null, ptr @_ZN5Test41A1fEv, ptr 
@_ZN5Test41C1gEi],
 // LLVM-SAME: [3 x ptr] [ptr inttoptr (i64 -8 to ptr), ptr null, ptr 
@_ZThn8_N5Test41C1gEi]
 // LLVM-SAME: }
 
-// LLVM: @_ZTVN5Test51CE = global { [3 x ptr], [3 x ptr] } {
+// LLVM: @_ZTVN5Test51CE = constant { [3 x ptr], [3 x ptr] } {
 // LLVM-SAME: [3 x ptr] [ptr null, ptr null, ptr @_ZN5Test51C1hEv],
 // LLVM-SAME: [3 x ptr] [ptr inttoptr (i64 -8 to ptr), ptr null, ptr 
@_ZThn8_N5Test51C1hEv]
 // LLVM-SAME: }

diff  --git a/clang/test/CIR/CodeGen/vbase.cpp 
b/clang/test/CIR/CodeGen/vbase.cpp
index e1b8d04f5247b..fb37a49c7856e 100644
--- a/clang/test/CIR/CodeGen/vbase.cpp
+++ b/clang/test/CIR/CodeGen/vbase.cpp
@@ -52,7 +52,7 @@ void ppp() { B b; }
 
 // Vtable definition for B
 // CIR: cir.global "private" {{.*}}@_ZTV1B = 
#cir.vtable<{#cir.const_array<[#cir.ptr<12 : i64> : !cir.ptr<!u8i>, 
#cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1B> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 3>}> : !rec_anon_struct3 {alignment = 8 : i64}
-// LLVM: @_ZTV1B = linkonce_odr global { [3 x ptr] } { [3 x ptr] [ptr inttoptr 
(i64 12 to ptr), ptr null, ptr @_ZTI1B] }, comdat, align 8
+// LLVM: @_ZTV1B = linkonce_odr constant { [3 x ptr] } { [3 x ptr] [ptr 
inttoptr (i64 12 to ptr), ptr null, ptr @_ZTI1B] }, comdat, align 8
 
 // OGCG: @_ZTV1B = linkonce_odr constant { [3 x ptr] } { [3 x ptr] [ptr 
inttoptr (i64 12 to ptr), ptr null, ptr @_ZTI1B] }, comdat, align 8
 

diff  --git a/clang/test/CIR/CodeGen/virtual-function-calls.cpp 
b/clang/test/CIR/CodeGen/virtual-function-calls.cpp
index 569bc7cf4e65a..3d7e3a8ae4712 100644
--- a/clang/test/CIR/CodeGen/virtual-function-calls.cpp
+++ b/clang/test/CIR/CodeGen/virtual-function-calls.cpp
@@ -16,9 +16,9 @@ A::A() {}
 // CIR: !rec_A = !cir.struct<"A" {data !cir.vptr}>
 // CIR: !rec_anon_struct = !cir.struct<{data !cir.array<!cir.ptr<!u8i> x 3>}>
 
-// CIR: cir.global "private" external @_ZTV1A : !rec_anon_struct
+// CIR: cir.global "private" constant external @_ZTV1A : !rec_anon_struct
 
-// LLVM: @_ZTV1A = external global { [3 x ptr] }
+// LLVM: @_ZTV1A = external constant { [3 x ptr] }
 
 // OGCG: @_ZTV1A = external constant { [3 x ptr] }
 

diff  --git a/clang/test/CIR/CodeGen/vtable-emission.cpp 
b/clang/test/CIR/CodeGen/vtable-emission.cpp
index d1522db762ba0..4c5a6f04719cf 100644
--- a/clang/test/CIR/CodeGen/vtable-emission.cpp
+++ b/clang/test/CIR/CodeGen/vtable-emission.cpp
@@ -3,7 +3,7 @@
 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-rtti -fclangir  
-emit-llvm -o %t-cir.ll %s
 // RUN: FileCheck --check-prefix=LLVM --input-file=%t-cir.ll %s
 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-rtti -emit-llvm -o 
%t.ll %s
-// RUN: FileCheck --check-prefix=OGCG --input-file=%t.ll %s
+// RUN: FileCheck --check-prefix=LLVM --input-file=%t.ll %s
 
 // Note: This test is using -fno-rtti so that we can delay implemntation of 
that handling.
 //       When rtti handling for vtables is implemented, that option should be 
removed.
@@ -18,7 +18,7 @@ void S::key() {}
 // CHECK-DAG: !rec_anon_struct = !cir.struct<{data !cir.array<!cir.ptr<!u8i> x 
4>}>
 
 // The definition of the key function should result in the vtable being 
emitted.
-// CHECK:      cir.global "private" external @_ZTV1S = #cir.vtable<{
+// CHECK:      cir.global "private" constant external @_ZTV1S = #cir.vtable<{
 // CHECK-SAME:     #cir.const_array<[
 // CHECK-SAME:         #cir.ptr<null> : !cir.ptr<!u8i>,
 // CHECK-SAME:         #cir.ptr<null> : !cir.ptr<!u8i>,
@@ -26,12 +26,9 @@ void S::key() {}
 // CHECK-SAME:         #cir.global_view<@_ZN1S6nonKeyEv> : !cir.ptr<!u8i>]>
 // CHECK-SAME:     : !cir.array<!cir.ptr<!u8i> x 4>}> : !rec_anon_struct
 
-// LLVM:      @_ZTV1S = global { [4 x ptr] } { [4 x ptr]
+// LLVM:      @_ZTV1S = {{(unnamed_addr )?}}constant { [4 x ptr] } { [4 x ptr]
 // LLVM-SAME:      [ptr null, ptr null, ptr @_ZN1S3keyEv, ptr @_ZN1S6nonKeyEv] 
}
 
-// OGCG:      @_ZTV1S = unnamed_addr constant { [4 x ptr] } { [4 x ptr]
-// OGCG-SAME:      [ptr null, ptr null, ptr @_ZN1S3keyEv, ptr @_ZN1S6nonKeyEv] 
}
-
 // CHECK: cir.func {{.*}} @_ZN1S3keyEv
 
 // The reference from the vtable should result in nonKey being emitted.

diff  --git a/clang/test/CIR/CodeGen/vtable-linkage-explicit-instantiation.cpp 
b/clang/test/CIR/CodeGen/vtable-linkage-explicit-instantiation.cpp
index ae63d0c4905aa..2f8fb92e571bd 100644
--- a/clang/test/CIR/CodeGen/vtable-linkage-explicit-instantiation.cpp
+++ b/clang/test/CIR/CodeGen/vtable-linkage-explicit-instantiation.cpp
@@ -5,7 +5,7 @@
 // RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu -fclangir 
-fno-clangir-call-conv-lowering -emit-llvm %s -o %t-cir.ll
 // RUN: FileCheck --check-prefix=LLVM --input-file=%t-cir.ll %s
 // RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu -emit-llvm %s 
-o %t.ll
-// RUN: FileCheck --check-prefix=OGCG --input-file=%t.ll %s
+// RUN: FileCheck --check-prefix=LLVM --input-file=%t.ll %s
 
 template <typename T>
 struct Base {
@@ -44,21 +44,17 @@ void use_key() {
 
 // Base has no key function and extern template declaration, so the vtable
 // gets external linkage.
-// CHECK: cir.global "private" external @_ZTV4BaseIiE
+// CHECK: cir.global "private" constant external @_ZTV4BaseIiE
 
 // The key function (~KeyBase) is not instantiated in this TU, so the vtable
 // also gets external linkage.
-// CHECK: cir.global "private" external @_ZTV7KeyBaseIiE
+// CHECK: cir.global "private" constant external @_ZTV7KeyBaseIiE
 
 // Verify the virtual call goes through the vtable.
 // CHECK: cir.func {{.*}} @_Z3useP4BaseIiE
 // CHECK:   cir.vtable.get_vptr
 // CHECK:   cir.vtable.get_virtual_fn_addr
 
-// LLVM: @_ZTV4BaseIiE = external global
-// LLVM: @_ZTV7KeyBaseIiE = external global
+// LLVM: @_ZTV4BaseIiE = external constant
+// LLVM: @_ZTV7KeyBaseIiE = external constant 
 // LLVM: define {{.*}} @_Z3useP4BaseIiE
-
-// OGCG: @_ZTV4BaseIiE = external constant
-// OGCG: @_ZTV7KeyBaseIiE = external constant
-// OGCG: define {{.*}} @_Z3useP4BaseIiE

diff  --git a/clang/test/CIR/CodeGen/vtt.cpp b/clang/test/CIR/CodeGen/vtt.cpp
index 9a30484314179..62fc27d4949b6 100644
--- a/clang/test/CIR/CodeGen/vtt.cpp
+++ b/clang/test/CIR/CodeGen/vtt.cpp
@@ -85,7 +85,7 @@ void D::y() {}
 // CIR-COMMON-SAME:    ]> : !cir.array<!cir.ptr<!u8i> x 4>
 // CIR-COMMON-SAME: }> : ![[REC_D_VTABLE]] {alignment = 8 : i64}
 
-// LLVM-COMMON:       @_ZTV1D = global { [5 x ptr], [4 x ptr], [4 x ptr] } {
+// LLVM-COMMON:       @_ZTV1D = constant { [5 x ptr], [4 x ptr], [4 x ptr] } {
 // LLVM-NO-RTTI-SAME:   [5 x ptr] [ptr inttoptr (i64 40 to ptr), ptr null, ptr 
null, ptr @_ZN1B1wEv, ptr @_ZN1D1yEv],
 // LLVM-RTTI-SAME:      [5 x ptr] [ptr inttoptr (i64 40 to ptr), ptr null, ptr 
@_ZTI1D, ptr @_ZN1B1wEv, ptr @_ZN1D1yEv],
 // LLVM-NO-RTTI-SAME:   [4 x ptr] [ptr inttoptr (i64 24 to ptr), ptr inttoptr 
(i64 -16 to ptr), ptr null, ptr @_ZN1C1xEv],
@@ -116,7 +116,7 @@ void D::y() {}
 // CIR-COMMON-SAME:   #cir.global_view<@_ZTV1D, [1 : i32, 3 : i32]> : 
!cir.ptr<!u8i>
 // CIR-COMMON-SAME: ]> : !cir.array<!cir.ptr<!u8i> x 7> {alignment = 8 : i64}
 
-// LLVM-COMMON:      @_ZTT1D = global [7 x ptr] [
+// LLVM-COMMON:      @_ZTT1D = constant [7 x ptr] [
 // LLVM-COMMON-SAME:   ptr getelementptr inbounds nuw (i8, ptr @_ZTV1D, i64 
24),
 // LLVM-COMMON-SAME:   ptr getelementptr inbounds nuw (i8, ptr @_ZTC1D0_1B, 
i64 24),
 // LLVM-COMMON-SAME:   ptr getelementptr inbounds nuw (i8, ptr @_ZTC1D0_1B, 
i64 56),
@@ -155,7 +155,7 @@ void D::y() {}
 // CIR-COMMON-SAME:    ]> : !cir.array<!cir.ptr<!u8i> x 4>
 // CIR-COMMON-SAME:    }> : ![[REC_B_OR_C_IN_D_VTABLE]]
 
-// LLVM-COMMON:       @_ZTC1D0_1B = global { [4 x ptr], [4 x ptr] } {
+// LLVM-COMMON:       @_ZTC1D0_1B = constant { [4 x ptr], [4 x ptr] } {
 // LLVM-NO-RTTI-SAME: [4 x ptr] [ptr inttoptr (i64 40 to ptr), ptr null, ptr 
null, ptr @_ZN1B1wEv],
 // LLVM-RTTI-SAME:    [4 x ptr] [ptr inttoptr (i64 40 to ptr), ptr null, ptr 
@_ZTI1B, ptr @_ZN1B1wEv],
 // LLVM-NO-RTTI-SAME: [4 x ptr] [ptr null, ptr inttoptr (i64 -40 to ptr), ptr 
null, ptr @_ZN1A1vEv]
@@ -194,7 +194,7 @@ void D::y() {}
 // CIR-COMMON-SAME:  ]> : !cir.array<!cir.ptr<!u8i> x 4>}>
 // CIR-COMMON-SAME:  : ![[REC_B_OR_C_IN_D_VTABLE]]
 
-// LLVM-COMMON:       @_ZTC1D16_1C = global { [4 x ptr], [4 x ptr] } {
+// LLVM-COMMON:       @_ZTC1D16_1C = constant { [4 x ptr], [4 x ptr] } {
 // LLVM-NO-RTTI-SAME:   [4 x ptr] [ptr inttoptr (i64 24 to ptr), ptr null, ptr 
null, ptr @_ZN1C1xEv],
 // LLVM-RTTI-SAME:      [4 x ptr] [ptr inttoptr (i64 24 to ptr), ptr null, ptr 
@_ZTI1C, ptr @_ZN1C1xEv],
 // LLVM-NO-RTTI-SAME:   [4 x ptr] [ptr null, ptr inttoptr (i64 -24 to ptr), 
ptr null, ptr @_ZN1A1vEv]
@@ -211,7 +211,7 @@ void D::y() {}
 
 // RTTI class type info for D
 
-// CIR-RTTI:  cir.globa{{.*}} @_ZTVN10__cxxabiv121__vmi_class_type_infoE : 
!cir.ptr<!cir.ptr<!u8i>>
+// CIR-RTTI:  cir.global{{.*}} @_ZTVN10__cxxabiv121__vmi_class_type_infoE : 
!cir.ptr<!cir.ptr<!u8i>>
 
 // CIR-RTTI:  cir.global{{.*}} @_ZTS1D = #cir.const_array<"1D" : 
!cir.array<!s8i x 2>, trailing_zeros> : !cir.array<!s8i x 3>
 
@@ -227,7 +227,7 @@ void D::y() {}
 // CIR-RTTI: cir.global{{.*}} @_ZTV1A : !rec_anon_struct3
 
 // LLVM-RTTI: @_ZTVN10__cxxabiv121__vmi_class_type_infoE = external global ptr
-// LLVM-RTTI: @_ZTS1D = global [3 x i8] c"1D\00", align 1
+// LLVM-RTTI: @_ZTS1D = constant [3 x i8] c"1D\00", align 1
 
 // LLVM-RTTI:      @_ZTI1D = constant { ptr, ptr, i32, i32, ptr, i64, ptr, i64 
} {
 // LLVM-RTTI-SAME:   ptr getelementptr (i8, ptr 
@_ZTVN10__cxxabiv121__vmi_class_type_infoE, i64 16),

diff  --git a/clang/test/CIR/CodeGenCXX/vtable-linkage.cpp 
b/clang/test/CIR/CodeGenCXX/vtable-linkage.cpp
index 201dd398bf745..54f6f9c54a69c 100644
--- a/clang/test/CIR/CodeGenCXX/vtable-linkage.cpp
+++ b/clang/test/CIR/CodeGenCXX/vtable-linkage.cpp
@@ -109,81 +109,81 @@ void use_F() {
 
 // B has a key function that is not defined in this translation unit so its 
vtable
 // has external linkage.
-// CIR-DAG: cir.global "private" external @_ZTV1B : !{{.*}}{alignment = 8 : 
i64}
-// LLVM-DAG: @_ZTV1B = external {{.*}}{ [3 x ptr] }, align 8
+// CIR-DAG: cir.global "private" constant external @_ZTV1B : !{{.*}}{alignment 
= 8 : i64}
+// LLVM-DAG: @_ZTV1B = external constant { [3 x ptr] }, align 8
 
 // C has no key function, so its vtable should have weak_odr linkage
 // and hidden visibility.
-// CIR-DAG: cir.global "private" linkonce_odr comdat @_ZTV1C = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.ptr<null> 
: !cir.ptr<!u8i>, #cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1C> : 
!cir.ptr<!u8i>, #cir.global_view<@_ZN1C1fEv> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 5>}> : !{{.*}}{alignment = 8 : i64}
-// CIR-DAG: cir.global linkonce_odr comdat @_ZTS1C = #cir.const_array<"1C" : 
!cir.array<!s8i x 2>, trailing_zeros> : !cir.array<!s8i x 3> {alignment = 1 : 
i64}
+// CIR-DAG: cir.global "private" constant linkonce_odr comdat @_ZTV1C = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, #cir.ptr<null> 
: !cir.ptr<!u8i>, #cir.ptr<null> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI1C> : 
!cir.ptr<!u8i>, #cir.global_view<@_ZN1C1fEv> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 5>}> : !{{.*}}{alignment = 8 : i64}
+// CIR-DAG: cir.global constant linkonce_odr comdat @_ZTS1C = 
#cir.const_array<"1C" : !cir.array<!s8i x 2>, trailing_zeros> : !cir.array<!s8i 
x 3> {alignment = 1 : i64}
 // CIR-DAG: cir.global constant linkonce_odr comdat @_ZTI1C = 
#cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv121__vmi_class_type_infoE, [2 
: i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS1C> : !cir.ptr<!u8i>, 
#cir.int<0> : !u32i, #cir.int<1> : !u32i, #cir.global_view<@_ZTI1B> : 
!cir.ptr<!u8i>, #cir.int<-8189> : !s64i}> : !{{.*}}{alignment = 8 : i64}
-// CIR-DAG: cir.global linkonce_odr comdat @_ZTT1C = 
#cir.const_array<[#cir.global_view<@_ZTV1C, [0 : i32, 4 : i32]> : 
!cir.ptr<!u8i>, #cir.global_view<@_ZTV1C, [0 : i32, 4 : i32]> : 
!cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 2> {alignment = 8 : i64}
-// LLVM-DAG: @_ZTV1C = linkonce_odr {{.*}}{ [5 x ptr] } { [5 x ptr] [ptr null, 
ptr null, ptr null, ptr @_ZTI1C, ptr @_ZN1C1fEv] }, comdat, align 8
-// LLVM-DAG: @_ZTS1C = linkonce_odr {{.*}}[{{[0-9]}} x i8] c"1C\00", comdat, 
align 1
-// LLVM-DAG: @_ZTI1C = linkonce_odr {{.*}}{ ptr, ptr, i32, i32, ptr, i64 } { 
ptr getelementptr{{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv121__vmi_class_type_infoE, 
i64 {{.*}}), ptr @_ZTS1C, i32 0, i32 1, ptr @_ZTI1B, i64 -8189 }, comdat
-// LLVM-DAG: @_ZTT1C = linkonce_odr {{.*}}[2 x ptr] [ptr getelementptr 
inbounds{{.*}}({{.*}}, ptr @_ZTV1C, {{.*}}, ptr getelementptr inbounds 
{{.*}}({{.*}}, ptr @_ZTV1C{{.*}})]
+// CIR-DAG: cir.global constant linkonce_odr comdat @_ZTT1C = 
#cir.const_array<[#cir.global_view<@_ZTV1C, [0 : i32, 4 : i32]> : 
!cir.ptr<!u8i>, #cir.global_view<@_ZTV1C, [0 : i32, 4 : i32]> : 
!cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 2> {alignment = 8 : i64}
+// LLVM-DAG: @_ZTV1C = linkonce_odr constant { [5 x ptr] } { [5 x ptr] [ptr 
null, ptr null, ptr null, ptr @_ZTI1C, ptr @_ZN1C1fEv] }, comdat, align 8
+// LLVM-DAG: @_ZTS1C = linkonce_odr constant [{{[0-9]}} x i8] c"1C\00", 
comdat, align 1
+// LLVM-DAG: @_ZTI1C = linkonce_odr constant { ptr, ptr, i32, i32, ptr, i64 } 
{ ptr getelementptr{{.*}}({{.*}}, ptr 
@_ZTVN10__cxxabiv121__vmi_class_type_infoE, i64 {{.*}}), ptr @_ZTS1C, i32 0, 
i32 1, ptr @_ZTI1B, i64 -8189 }, comdat
+// LLVM-DAG: @_ZTT1C = linkonce_odr{{.*}} constant [2 x ptr] [ptr 
getelementptr inbounds{{.*}}({{.*}}, ptr @_ZTV1C, {{.*}}, ptr getelementptr 
inbounds {{.*}}({{.*}}, ptr @_ZTV1C{{.*}})]
 
 // D has a key function that is defined in this translation unit so its vtable 
is
 // defined in the translation unit.
-// CIR-DAG: cir.global "private" external @_ZTV1D = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1D> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1D1fEv> : 
!cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : 
i64}
-// CIR-DAG: cir.global external @_ZTS1D = #cir.const_array<"1D" : 
!cir.array<!s8i x 2>, trailing_zeros> : !cir.array<!s8i x 3> {alignment = 1 : 
i64}
+// CIR-DAG: cir.global "private" constant external @_ZTV1D = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1D> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1D1fEv> : 
!cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : 
i64}
+// CIR-DAG: cir.global constant external @_ZTS1D = #cir.const_array<"1D" : 
!cir.array<!s8i x 2>, trailing_zeros> : !cir.array<!s8i x 3> {alignment = 1 : 
i64}
 // CIR-DAG: cir.global constant external @_ZTI1D = 
#cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv117__class_type_infoE, [2 : 
i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS1D> : !cir.ptr<!u8i>}> : 
!{{.*}}{alignment = 8 : i64}
-// LLVM-DAG: @_ZTV1D = {{(constant|global)}} { [3 x ptr] } { [3 x ptr] [ptr 
null, ptr @_ZTI1D, ptr @_ZN1D1fEv] }, align 8
-// LLVM-DAG: @_ZTS1D = {{(constant|global)}} [{{[0-9]}} x i8] c"1D\00", align 1
+// LLVM-DAG: @_ZTV1D = constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr 
@_ZTI1D, ptr @_ZN1D1fEv] }, align 8
+// LLVM-DAG: @_ZTS1D = constant [{{[0-9]}} x i8] c"1D\00", align 1
 // LLVM-DAG: @_ZTI1D = constant { ptr, ptr } { ptr getelementptr 
{{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 {{[0-9]+}}), ptr 
@_ZTS1D }, align 8
 
 // E<char> is an explicit specialization with a key function defined
 // in this translation unit, so its vtable should have external
 // linkage.
-// CIR-DAG: cir.global "private" external @_ZTV1EIcE = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1EIcE> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZN1EIcE6anchorEv> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64}
-// CIR-DAG: cir.global external @_ZTS1EIcE = #cir.const_array<"1EIcE" : 
!cir.array<!s8i x 5>, trailing_zeros> : !cir.array<!s8i x 6> {alignment = 1 : 
i64}
+// CIR-DAG: cir.global "private" constant external @_ZTV1EIcE = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1EIcE> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZN1EIcE6anchorEv> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64}
+// CIR-DAG: cir.global constant external @_ZTS1EIcE = #cir.const_array<"1EIcE" 
: !cir.array<!s8i x 5>, trailing_zeros> : !cir.array<!s8i x 6> {alignment = 1 : 
i64}
 // CIR-DAG: cir.global constant external @_ZTI1EIcE = 
#cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv117__class_type_infoE, [2 : 
i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS1EIcE> : !cir.ptr<!u8i>}> : 
!{{.*}}{alignment = 8 : i64}
-// LLVM-DAG: @_ZTV1EIcE = {{(constant|global)}} { [3 x ptr] } { [3 x ptr] [ptr 
null, ptr @_ZTI1EIcE, ptr @_ZN1EIcE6anchorEv] }, align 8
-// LLVM-DAG: @_ZTS1EIcE = {{(constant|global)}} [6 x i8] c"1EIcE\00", align 1
+// LLVM-DAG: @_ZTV1EIcE = constant { [3 x ptr] } { [3 x ptr] [ptr null, ptr 
@_ZTI1EIcE, ptr @_ZN1EIcE6anchorEv] }, align 8
+// LLVM-DAG: @_ZTS1EIcE = constant [6 x i8] c"1EIcE\00", align 1
 // LLVM-DAG: @_ZTI1EIcE = constant { ptr, ptr } { ptr getelementptr 
{{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 {{.*}}), ptr 
@_ZTS1EIcE }, align 8
 
 // E<short> is an explicit template instantiation with a key function
 // defined in this translation unit, so its vtable should have
 // weak_odr linkage.
-// CIR-DAG: cir.global "private" weak_odr comdat @_ZTV1EIsE = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1EIsE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1EIsED1Ev> 
: !cir.ptr<!u8i>, #cir.global_view<@_ZN1EIsED0Ev> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 4>}> : !{{.*}}{alignment = 8 : i64}
+// CIR-DAG: cir.global "private" constant weak_odr comdat @_ZTV1EIsE = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1EIsE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1EIsED1Ev> 
: !cir.ptr<!u8i>, #cir.global_view<@_ZN1EIsED0Ev> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 4>}> : !{{.*}}{alignment = 8 : i64}
 // CIR-DAG: cir.global constant weak_odr comdat @_ZTI1EIsE = 
#cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv117__class_type_infoE, [2 : 
i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS1EIsE> : !cir.ptr<!u8i>}> : 
!{{.*}}{alignment = 8 : i64}
-// CIR-DAG: cir.global weak_odr comdat @_ZTS1EIsE = #cir.const_array<"1EIsE" : 
!cir.array<!s8i x 5>, trailing_zeros> : !cir.array<!s8i x 6> {alignment = 1 : 
i64}
-// LLVM-DAG: @_ZTV1EIsE = weak_odr {{.*}}{ [4 x ptr] } { [4 x ptr] [ptr null, 
ptr @_ZTI1EIsE, ptr @_ZN1EIsED1Ev, ptr @_ZN1EIsED0Ev] }, comdat, align 8
+// CIR-DAG: cir.global constant weak_odr comdat @_ZTS1EIsE = 
#cir.const_array<"1EIsE" : !cir.array<!s8i x 5>, trailing_zeros> : 
!cir.array<!s8i x 6> {alignment = 1 : i64}
+// LLVM-DAG: @_ZTV1EIsE = weak_odr constant { [4 x ptr] } { [4 x ptr] [ptr 
null, ptr @_ZTI1EIsE, ptr @_ZN1EIsED1Ev, ptr @_ZN1EIsED0Ev] }, comdat, align 8
 // LLVM-DAG: @_ZTI1EIsE = weak_odr constant { ptr, ptr } { ptr getelementptr 
{{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 {{.*}}), ptr 
@_ZTS1EIsE }, comdat
-// LLVM-DAG: @_ZTS1EIsE = weak_odr {{.*}}[6 x i8] c"1EIsE\00", comdat
+// LLVM-DAG: @_ZTS1EIsE = weak_odr constant [6 x i8] c"1EIsE\00", comdat
 
 // F<short> is an explicit template instantiation without a key
 // function, so its vtable should have weak_odr linkage
-// CIR-DAG: cir.global "private" weak_odr comdat @_ZTV1FIsE = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1FIsE> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZN1FIsE3fooEv> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64}
-// CIR-DAG: cir.global weak_odr comdat @_ZTS1FIsE = #cir.const_array<"1FIsE" : 
!cir.array<!s8i x 5>, trailing_zeros> : !cir.array<!s8i x 6> {alignment = 1 : 
i64}
+// CIR-DAG: cir.global "private" constant weak_odr comdat @_ZTV1FIsE = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1FIsE> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZN1FIsE3fooEv> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64}
+// CIR-DAG: cir.global constant weak_odr comdat @_ZTS1FIsE = 
#cir.const_array<"1FIsE" : !cir.array<!s8i x 5>, trailing_zeros> : 
!cir.array<!s8i x 6> {alignment = 1 : i64}
 // CIR-DAG: cir.global constant weak_odr comdat @_ZTI1FIsE = 
#cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv117__class_type_infoE, [2 : 
i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS1FIsE> : !cir.ptr<!u8i>}> : 
!{{.*}}{alignment = 8 : i64}
-// LLVM-DAG: @_ZTV1FIsE = weak_odr {{.*}}{ [3 x ptr] } { [3 x ptr] [ptr null, 
ptr @_ZTI1FIsE, ptr @_ZN1FIsE3fooEv] }, comdat, align 8
-// LLVM-DAG: @_ZTS1FIsE = weak_odr {{.*}}[6 x i8] c"1FIsE\00", comdat, align 1
+// LLVM-DAG: @_ZTV1FIsE = weak_odr constant { [3 x ptr] } { [3 x ptr] [ptr 
null, ptr @_ZTI1FIsE, ptr @_ZN1FIsE3fooEv] }, comdat, align 8
+// LLVM-DAG: @_ZTS1FIsE = weak_odr constant [6 x i8] c"1FIsE\00", comdat, 
align 1
 // LLVM-DAG: @_ZTI1FIsE = weak_odr constant { ptr, ptr } { ptr getelementptr 
{{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 {{.*}}), ptr 
@_ZTS1FIsE }, comdat
 
 // E<long> is an implicit template instantiation with a key function
 // defined in this translation unit, so its vtable should have
 // linkonce_odr linkage.
-// CIR-DAG: cir.global "private" linkonce_odr comdat @_ZTV1EIlE = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1EIlE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1EIlED1Ev> 
: !cir.ptr<!u8i>, #cir.global_view<@_ZN1EIlED0Ev> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 4>}> : !{{.*}}{alignment = 8 : i64}
-// CIR-DAG: cir.global linkonce_odr comdat @_ZTS1EIlE = 
#cir.const_array<"1EIlE" : !cir.array<!s8i x 5>, trailing_zeros> : 
!cir.array<!s8i x 6> {alignment = 1 : i64}
+// CIR-DAG: cir.global "private" constant linkonce_odr comdat @_ZTV1EIlE = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1EIlE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1EIlED1Ev> 
: !cir.ptr<!u8i>, #cir.global_view<@_ZN1EIlED0Ev> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 4>}> : !{{.*}}{alignment = 8 : i64}
+// CIR-DAG: cir.global constant linkonce_odr comdat @_ZTS1EIlE = 
#cir.const_array<"1EIlE" : !cir.array<!s8i x 5>, trailing_zeros> : 
!cir.array<!s8i x 6> {alignment = 1 : i64}
 // CIR-DAG: cir.global constant linkonce_odr comdat @_ZTI1EIlE = 
#cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv117__class_type_infoE, [2 : 
i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS1EIlE> : !cir.ptr<!u8i>}> : 
!{{.*}}{alignment = 8 : i64}
-// LLVM-DAG: @_ZTV1EIlE = linkonce_odr {{.*}}{ [4 x ptr] } { [4 x ptr] [ptr 
null, ptr @_ZTI1EIlE, ptr @_ZN1EIlED1Ev, ptr @_ZN1EIlED0Ev] }, comdat, align 8
-// LLVM-DAG: @_ZTS1EIlE = linkonce_odr {{.*}}[6 x i8] c"1EIlE\00", comdat, 
align 1
+// LLVM-DAG: @_ZTV1EIlE = linkonce_odr constant { [4 x ptr] } { [4 x ptr] [ptr 
null, ptr @_ZTI1EIlE, ptr @_ZN1EIlED1Ev, ptr @_ZN1EIlED0Ev] }, comdat, align 8
+// LLVM-DAG: @_ZTS1EIlE = linkonce_odr constant [6 x i8] c"1EIlE\00", comdat, 
align 1
 // LLVM-DAG: @_ZTI1EIlE = linkonce_odr constant { ptr, ptr } { ptr 
getelementptr {{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 
{{.*}}), ptr @_ZTS1EIlE }, comdat
 
 // F<long> is an implicit template instantiation with no key function,
 // so its vtable should have linkonce_odr linkage.
-// CIR-DAG: cir.global "private" linkonce_odr comdat @_ZTV1FIlE = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1FIlE> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZN1FIlE3fooEv> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64}
-// CIR-DAG: cir.global linkonce_odr comdat @_ZTS1FIlE = 
#cir.const_array<"1FIlE" : !cir.array<!s8i x 5>, trailing_zeros> : 
!cir.array<!s8i x 6> {alignment = 1 : i64}
+// CIR-DAG: cir.global "private" constant linkonce_odr comdat @_ZTV1FIlE = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1FIlE> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZN1FIlE3fooEv> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64}
+// CIR-DAG: cir.global constant linkonce_odr comdat @_ZTS1FIlE = 
#cir.const_array<"1FIlE" : !cir.array<!s8i x 5>, trailing_zeros> : 
!cir.array<!s8i x 6> {alignment = 1 : i64}
 // CIR-DAG: cir.global constant linkonce_odr comdat @_ZTI1FIlE = 
#cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv117__class_type_infoE, [2 : 
i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS1FIlE> : !cir.ptr<!u8i>}> : 
!{{.*}}{alignment = 8 : i64}
-// LLVM-DAG: @_ZTV1FIlE = linkonce_odr {{.*}}{ [3 x ptr] } { [3 x ptr] [ptr 
null, ptr @_ZTI1FIlE, ptr @_ZN1FIlE3fooEv] }, comdat, align 8
-// LLVM-DAG: @_ZTS1FIlE = linkonce_odr {{.*}}[6 x i8] c"1FIlE\00", comdat, 
align 1
+// LLVM-DAG: @_ZTV1FIlE = linkonce_odr constant { [3 x ptr] } { [3 x ptr] [ptr 
null, ptr @_ZTI1FIlE, ptr @_ZN1FIlE3fooEv] }, comdat, align 8
+// LLVM-DAG: @_ZTS1FIlE = linkonce_odr constant [6 x i8] c"1FIlE\00", comdat, 
align 1
 // LLVM-DAG: @_ZTI1FIlE = linkonce_odr constant { ptr, ptr } { ptr 
getelementptr {{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 
{{.*}}), ptr @_ZTS1FIlE }, comdat
 
 // F<int> is an explicit template instantiation declaration without a
 // key function, so its vtable should have external linkage.
-// CIR-DAG: cir.global "private" external @_ZTV1FIiE : !{{.*}}{alignment = 8 : 
i64}
-// LLVM-DAG: @_ZTV1FIiE = external {{.*}}{ [3 x ptr] }, align 8
+// CIR-DAG: cir.global "private" constant external @_ZTV1FIiE : 
!{{.*}}{alignment = 8 : i64}
+// LLVM-DAG: @_ZTV1FIiE = external constant { [3 x ptr] }, align 8
 
 // E<int> is an explicit template instantiation declaration. It has a
 // key function is not instantiated, so we know that vtable definition
@@ -191,38 +191,38 @@ void use_F() {
 // so we can mark it as external (without optimizations) and
 // available_externally (with optimizations) because all of the inline
 // virtual functions have been emitted.
-// CIR-DAG: cir.global "private" external @_ZTV1EIiE : !{{.*}}{alignment = 8 : 
i64}
-// LLVM-DAG: @_ZTV1EIiE = external {{.*}}{ [4 x ptr] }, align 8
+// CIR-DAG: cir.global "private" constant external @_ZTV1EIiE : 
!{{.*}}{alignment = 8 : i64}
+// LLVM-DAG: @_ZTV1EIiE = external constant { [4 x ptr] }, align 8
 
 // The anonymous struct for e has no linkage, so the vtable should have
 // internal linkage.
-// CIR-DAG: cir.global "private" internal dso_local @_ZTV3$_0 = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI3$_0> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1D1fEv> : 
!cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : 
i64}
-// CIR-DAG: cir.global internal dso_local @_ZTS3$_0 = #cir.const_array<"3$_0" 
: !cir.array<!s8i x 4>, trailing_zeros> : !cir.array<!s8i x 5> {alignment = 1 : 
i64}
+// CIR-DAG: cir.global "private" constant internal dso_local @_ZTV3$_0 = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI3$_0> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1D1fEv> : 
!cir.ptr<!u8i>]> : !cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : 
i64}
+// CIR-DAG: cir.global constant internal dso_local @_ZTS3$_0 = 
#cir.const_array<"3$_0" : !cir.array<!s8i x 4>, trailing_zeros> : 
!cir.array<!s8i x 5> {alignment = 1 : i64}
 // CIR-DAG: cir.global constant internal @_ZTI3$_0 = 
#cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv120__si_class_type_infoE, [2 : 
i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS3$_0> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1D> : !cir.ptr<!u8i>}> : !{{.*}}{alignment = 8 : i64}
-// LLVM-DAG: @"_ZTV3$_0" = internal {{.*}}{ [3 x ptr] } { [3 x ptr] [ptr null, 
ptr @"_ZTI3$_0", ptr @_ZN1D1fEv] }, align 8
-// LLVM-DAG: @"_ZTS3$_0" = internal {{.*}}[5 x i8] c"3$_0\00", align 1
+// LLVM-DAG: @"_ZTV3$_0" = internal constant { [3 x ptr] } { [3 x ptr] [ptr 
null, ptr @"_ZTI3$_0", ptr @_ZN1D1fEv] }, align 8
+// LLVM-DAG: @"_ZTS3$_0" = internal constant [5 x i8] c"3$_0\00", align 1
 // LLVM-DAG: @"_ZTI3$_0" = internal constant { ptr, ptr, ptr } { ptr 
getelementptr {{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv120__si_class_type_infoE, i64 
{{.*}}), ptr @"_ZTS3$_0", ptr @_ZTI1D }, align 8
 
 // The A vtable should have internal linkage since it is inside an anonymous 
 // namespace.
-// CIR-DAG: cir.global "private" internal dso_local @_ZTVN12_GLOBAL__N_11AE = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTIN12_GLOBAL__N_11AE> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZN12_GLOBAL__N_11A1fEv> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64}
-// CIR-DAG: cir.global internal dso_local @_ZTSN12_GLOBAL__N_11AE = 
#cir.const_array<"N12_GLOBAL__N_11AE" : !cir.array<!s8i x 18>, trailing_zeros> 
: !cir.array<!s8i x 19> {alignment = 1 : i64}
+// CIR-DAG: cir.global "private" constant internal dso_local 
@_ZTVN12_GLOBAL__N_11AE = #cir.vtable<{#cir.const_array<[#cir.ptr<null> : 
!cir.ptr<!u8i>, #cir.global_view<@_ZTIN12_GLOBAL__N_11AE> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZN12_GLOBAL__N_11A1fEv> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64}
+// CIR-DAG: cir.global constant internal dso_local @_ZTSN12_GLOBAL__N_11AE = 
#cir.const_array<"N12_GLOBAL__N_11AE" : !cir.array<!s8i x 18>, trailing_zeros> 
: !cir.array<!s8i x 19> {alignment = 1 : i64}
 // CIR-DAG: cir.global constant internal @_ZTIN12_GLOBAL__N_11AE = 
#cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv117__class_type_infoE, [2 : 
i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTSN12_GLOBAL__N_11AE> : 
!cir.ptr<!u8i>}> : !{{.*}}{alignment = 8 : i64}
-// LLVM-DAG: @_ZTVN12_GLOBAL__N_11AE = internal {{.*}}{ [3 x ptr] } { [3 x 
ptr] [ptr null, ptr @_ZTIN12_GLOBAL__N_11AE, ptr @_ZN12_GLOBAL__N_11A1fEv] }, 
align 8
-// LLVM-DAG: @_ZTSN12_GLOBAL__N_11AE = internal {{.*}}[19 x i8] 
c"N12_GLOBAL__N_11AE\00", align 1
+// LLVM-DAG: @_ZTVN12_GLOBAL__N_11AE = internal constant { [3 x ptr] } { [3 x 
ptr] [ptr null, ptr @_ZTIN12_GLOBAL__N_11AE, ptr @_ZN12_GLOBAL__N_11A1fEv] }, 
align 8
+// LLVM-DAG: @_ZTSN12_GLOBAL__N_11AE = internal constant [19 x i8] 
c"N12_GLOBAL__N_11AE\00", align 1
 // LLVM-DAG: @_ZTIN12_GLOBAL__N_11AE = internal constant { ptr, ptr } { ptr 
getelementptr {{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 
{{.*}}), ptr @_ZTSN12_GLOBAL__N_11AE }, align 8
 
 // F<char> is an explicit specialization without a key function, so
 // its vtable should have linkonce_odr linkage.
-// CIR-DAG: cir.global "private" linkonce_odr comdat @_ZTV1FIcE = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1FIcE> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZN1FIcE3fooEv> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64}
-// CIR-DAG: cir.global linkonce_odr comdat @_ZTS1FIcE = 
#cir.const_array<"1FIcE" : !cir.array<!s8i x 5>, trailing_zeros> : 
!cir.array<!s8i x 6> {alignment = 1 : i64}
+// CIR-DAG: cir.global "private" constant linkonce_odr comdat @_ZTV1FIcE = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1FIcE> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZN1FIcE3fooEv> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 3>}> : !{{.*}}{alignment = 8 : i64}
+// CIR-DAG: cir.global constant linkonce_odr comdat @_ZTS1FIcE = 
#cir.const_array<"1FIcE" : !cir.array<!s8i x 5>, trailing_zeros> : 
!cir.array<!s8i x 6> {alignment = 1 : i64}
 // CIR-DAG: cir.global constant linkonce_odr comdat @_ZTI1FIcE = 
#cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv117__class_type_infoE, [2 : 
i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS1FIcE> : !cir.ptr<!u8i>}> : 
!{{.*}}{alignment = 8 : i64}
-// LLVM-DAG: @_ZTV1FIcE = linkonce_odr {{.*}}{ [3 x ptr] } { [3 x ptr] [ptr 
null, ptr @_ZTI1FIcE, ptr @_ZN1FIcE3fooEv] }, comdat, align 8
-// LLVM-DAG: @_ZTS1FIcE = linkonce_odr {{.*}}[6 x i8] c"1FIcE\00", comdat, 
align 1
+// LLVM-DAG: @_ZTV1FIcE = linkonce_odr constant { [3 x ptr] } { [3 x ptr] [ptr 
null, ptr @_ZTI1FIcE, ptr @_ZN1FIcE3fooEv] }, comdat, align 8
+// LLVM-DAG: @_ZTS1FIcE = linkonce_odr constant [6 x i8] c"1FIcE\00", comdat, 
align 1
 // LLVM-DAG: @_ZTI1FIcE = linkonce_odr constant { ptr, ptr } { ptr 
getelementptr {{.*}}({{.*}}, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 
{{.*}}), ptr @_ZTS1FIcE }, comdat
 
-// CIR-DAG: cir.global "private" linkonce_odr comdat @_ZTV1GIiE = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1GIiE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1GIiE2f0Ev> 
: !cir.ptr<!u8i>, #cir.global_view<@_ZN1GIiE2f1Ev> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 4>}> : !{{.*}}{alignment = 8 : i64}
-// LLVM-DAG: @_ZTV1GIiE = linkonce_odr {{.*}}{ [4 x ptr] } { [4 x ptr] [ptr 
null, ptr @_ZTI1GIiE, ptr @_ZN1GIiE2f0Ev, ptr @_ZN1GIiE2f1Ev] }, comdat, align 8
+// CIR-DAG: cir.global "private" constant linkonce_odr comdat @_ZTV1GIiE = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1GIiE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1GIiE2f0Ev> 
: !cir.ptr<!u8i>, #cir.global_view<@_ZN1GIiE2f1Ev> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 4>}> : !{{.*}}{alignment = 8 : i64}
+// LLVM-DAG: @_ZTV1GIiE = linkonce_odr constant { [4 x ptr] } { [4 x ptr] [ptr 
null, ptr @_ZTI1GIiE, ptr @_ZN1GIiE2f0Ev, ptr @_ZN1GIiE2f1Ev] }, comdat, align 8
 template <typename T>
 class G {
 public:
@@ -238,8 +238,8 @@ void G_f0()  { new G<int>(); }
 
 // H<int> has a key function without a body but it's a template instantiation
 // so its VTable must be emitted.
-// CIR-DAG: cir.global "private" linkonce_odr comdat @_ZTV1HIiE = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1HIiE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1HIiED1Ev> 
: !cir.ptr<!u8i>, #cir.global_view<@_ZN1HIiED0Ev> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 4>}> : !{{.*}}{alignment = 8 : i64}
-// LLVM-DAG: @_ZTV1HIiE = linkonce_odr {{.*}}{ [4 x ptr] } { [4 x ptr] [ptr 
null, ptr @_ZTI1HIiE, ptr @_ZN1HIiED1Ev, ptr @_ZN1HIiED0Ev] }, comdat, align 8
+// CIR-DAG: cir.global "private" constant linkonce_odr comdat @_ZTV1HIiE = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI1HIiE> : !cir.ptr<!u8i>, #cir.global_view<@_ZN1HIiED1Ev> 
: !cir.ptr<!u8i>, #cir.global_view<@_ZN1HIiED0Ev> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 4>}> : !{{.*}}{alignment = 8 : i64}
+// LLVM-DAG: @_ZTV1HIiE = linkonce_odr constant { [4 x ptr] } { [4 x ptr] [ptr 
null, ptr @_ZTI1HIiE, ptr @_ZN1HIiED1Ev, ptr @_ZN1HIiED0Ev] }, comdat, align 8
 template <typename T>
 class H {
 public:
@@ -253,10 +253,10 @@ void use_H() {
 // I<int> has an explicit instantiation declaration and needs a VTT and
 // construction vtables.
 
-// CIR-DAG: cir.global "private" external @_ZTV1IIiE : !{{.*}}{alignment = 8 : 
i64}
-// CIR-DAG: cir.global "private" external @_ZTT1IIiE : 
!cir.array<!cir.ptr<!u8i> x 4> {alignment = 8 : i64}
-// LLVM-DAG: @_ZTV1IIiE = external {{.*}}{ [5 x ptr] }, align 8
-// LLVM-DAG: @_ZTT1IIiE = external {{.*}}[4 x ptr], align 8
+// CIR-DAG: cir.global "private" constant external @_ZTV1IIiE : 
!{{.*}}{alignment = 8 : i64}
+// CIR-DAG: cir.global "private" constant external @_ZTT1IIiE : 
!cir.array<!cir.ptr<!u8i> x 4> {alignment = 8 : i64}
+// LLVM-DAG: @_ZTV1IIiE = external constant { [5 x ptr] }, align 8
+// LLVM-DAG: @_ZTT1IIiE = external {{.*}}constant [4 x ptr], align 8
 struct VBase1 { virtual void f(); }; struct VBase2 : virtual VBase1 {};
 template<typename T>
 struct I : VBase2 {};

diff  --git a/clang/test/CIR/CodeGenCXX/vtable-pure-deleted-funcs.cpp 
b/clang/test/CIR/CodeGenCXX/vtable-pure-deleted-funcs.cpp
index 1372d86a3d15e..c2fca1bd744bc 100644
--- a/clang/test/CIR/CodeGenCXX/vtable-pure-deleted-funcs.cpp
+++ b/clang/test/CIR/CodeGenCXX/vtable-pure-deleted-funcs.cpp
@@ -13,8 +13,8 @@ struct Struct {
 void Struct::f3(){}
 
 
-// CIR: cir.global "private" external @_ZTV6Struct = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI6Struct> : !cir.ptr<!u8i>, 
#cir.global_view<@__cxa_pure_virtual> : !cir.ptr<!u8i>, 
#cir.global_view<@__cxa_deleted_virtual> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZN6Struct2f3Ev> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 5>}>
-// LLVM: @_ZTV6Struct = {{.*}}{ [5 x ptr] } { [5 x ptr] [ptr null, ptr 
@_ZTI6Struct, ptr @__cxa_pure_virtual, ptr @__cxa_deleted_virtual, ptr 
@_ZN6Struct2f3Ev] }
+// CIR: cir.global "private" constant external @_ZTV6Struct = 
#cir.vtable<{#cir.const_array<[#cir.ptr<null> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZTI6Struct> : !cir.ptr<!u8i>, 
#cir.global_view<@__cxa_pure_virtual> : !cir.ptr<!u8i>, 
#cir.global_view<@__cxa_deleted_virtual> : !cir.ptr<!u8i>, 
#cir.global_view<@_ZN6Struct2f3Ev> : !cir.ptr<!u8i>]> : 
!cir.array<!cir.ptr<!u8i> x 5>}>
+// LLVM: @_ZTV6Struct = constant { [5 x ptr] } { [5 x ptr] [ptr null, ptr 
@_ZTI6Struct, ptr @__cxa_pure_virtual, ptr @__cxa_deleted_virtual, ptr 
@_ZN6Struct2f3Ev] }
 
 // CIR: cir.global constant external @_ZTI6Struct = 
#cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv117__class_type_infoE, [2 : 
i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS6Struct> : !cir.ptr<!u8i>}>
 // LLVM-CIR: @_ZTI6Struct = constant { ptr, ptr } { ptr getelementptr (i8, ptr 
@_ZTVN10__cxxabiv117__class_type_infoE, i64 16), ptr @_ZTS6Struct }


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to