https://github.com/andykaylor updated https://github.com/llvm/llvm-project/pull/136387
>From f161bed5972815b535fb21b48ec243d483978685 Mon Sep 17 00:00:00 2001 From: Andy Kaylor <akay...@nvidia.com> Date: Fri, 18 Apr 2025 16:24:53 -0700 Subject: [PATCH 1/3] [CIR] Introduce type aliases for records This introduces MLIR aliases for ClangIR record types. --- clang/lib/CIR/Dialect/IR/CIRDialect.cpp | 8 +++++ clang/test/CIR/CodeGen/struct.c | 42 ++++++++++++------------- clang/test/CIR/CodeGen/struct.cpp | 5 ++- clang/test/CIR/CodeGen/typedef.c | 4 +-- clang/test/CIR/CodeGen/union.c | 5 ++- clang/test/CIR/IR/struct.cir | 14 ++++++--- 6 files changed, 43 insertions(+), 35 deletions(-) diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp index 146c91b253f39..4fb40d290189a 100644 --- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp +++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp @@ -33,6 +33,14 @@ struct CIROpAsmDialectInterface : public OpAsmDialectInterface { using OpAsmDialectInterface::OpAsmDialectInterface; AliasResult getAlias(Type type, raw_ostream &os) const final { + if (auto recordType = dyn_cast<cir::RecordType>(type)) { + StringAttr nameAttr = recordType.getName(); + if (!nameAttr) + os << "ty_anon_" << recordType.getKindAsStr(); + else + os << "ty_" << nameAttr.getValue(); + return AliasResult::OverridableAlias; + } if (auto intType = dyn_cast<cir::IntType>(type)) { // We only provide alias for standard integer types (i.e. integer types // whose width is a power of 2 and at least 8). diff --git a/clang/test/CIR/CodeGen/struct.c b/clang/test/CIR/CodeGen/struct.c index b78a2367bda3a..9bd3d74a64084 100644 --- a/clang/test/CIR/CodeGen/struct.c +++ b/clang/test/CIR/CodeGen/struct.c @@ -7,6 +7,12 @@ // For LLVM IR checks, the structs are defined before the variables, so these // checks are at the top. +// CIR-DAG: !ty_IncompleteS = !cir.record<struct "IncompleteS" incomplete> +// CIR-DAG: !ty_CompleteS = !cir.record<struct "CompleteS" {!s32i, !s8i}> +// CIR-DAG: !ty_OuterS = !cir.record<struct "OuterS" {!ty_InnerS, !s32i}> +// CIR-DAG: !ty_InnerS = !cir.record<struct "InnerS" {!s32i, !s8i}> +// CIR-DAG: !ty_PackedS = !cir.record<struct "PackedS" packed {!s32i, !s8i}> +// CIR-DAG: !ty_PackedAndPaddedS = !cir.record<struct "PackedAndPaddedS" packed padded {!s32i, !s8i, !u8i}> // LLVM-DAG: %struct.CompleteS = type { i32, i8 } // LLVM-DAG: %struct.OuterS = type { %struct.InnerS, i32 } // LLVM-DAG: %struct.InnerS = type { i32, i8 } @@ -30,10 +36,9 @@ struct CompleteS { char b; } cs; -// CIR: cir.global external @cs = #cir.zero : !cir.record<struct -// CIR-SAME: "CompleteS" {!s32i, !s8i}> -// LLVM-DAG: @cs = dso_local global %struct.CompleteS zeroinitializer -// OGCG-DAG: @cs = global %struct.CompleteS zeroinitializer, align 4 +// CIR: cir.global external @cs = #cir.zero : !ty_CompleteS +// LLVM-DAG: @cs = dso_local global %struct.CompleteS zeroinitializer +// OGCG-DAG: @cs = global %struct.CompleteS zeroinitializer, align 4 struct InnerS { int a; @@ -47,10 +52,9 @@ struct OuterS { struct OuterS os; -// CIR: cir.global external @os = #cir.zero : !cir.record<struct -// CIR-SAME: "OuterS" {!cir.record<struct "InnerS" {!s32i, !s8i}>, !s32i}> -// LLVM-DAG: @os = dso_local global %struct.OuterS zeroinitializer -// OGCG-DAG: @os = global %struct.OuterS zeroinitializer, align 4 +// CIR: cir.global external @os = #cir.zero : !ty_OuterS +// LLVM-DAG: @os = dso_local global %struct.OuterS zeroinitializer +// OGCG-DAG: @os = global %struct.OuterS zeroinitializer, align 4 #pragma pack(push) #pragma pack(1) @@ -60,20 +64,18 @@ struct PackedS { char a1; } ps; -// CIR: cir.global external @ps = #cir.zero : !cir.record<struct "PackedS" -// CIR-SAME: packed {!s32i, !s8i}> -// LLVM-DAG: @ps = dso_local global %struct.PackedS zeroinitializer -// OGCG-DAG: @ps = global %struct.PackedS zeroinitializer, align 1 +// CIR: cir.global external @ps = #cir.zero : !ty_PackedS +// LLVM-DAG: @ps = dso_local global %struct.PackedS zeroinitializer +// OGCG-DAG: @ps = global %struct.PackedS zeroinitializer, align 1 struct PackedAndPaddedS { int b0; char b1; } __attribute__((aligned(2))) pps; -// CIR: cir.global external @pps = #cir.zero : !cir.record<struct -// CIR-SAME: "PackedAndPaddedS" packed padded {!s32i, !s8i, !u8i}> -// LLVM-DAG: @pps = dso_local global %struct.PackedAndPaddedS zeroinitializer -// OGCG-DAG: @pps = global %struct.PackedAndPaddedS zeroinitializer, align 2 +// CIR: cir.global external @pps = #cir.zero : !ty_PackedAndPaddedS +// LLVM-DAG: @pps = dso_local global %struct.PackedAndPaddedS zeroinitializer +// OGCG-DAG: @pps = global %struct.PackedAndPaddedS zeroinitializer, align 2 #pragma pack(pop) @@ -82,9 +84,7 @@ void f(void) { } // CIR: cir.func @f() -// CIR-NEXT: cir.alloca !cir.ptr<!cir.record<struct "IncompleteS" incomplete>>, -// CIR-SAME: !cir.ptr<!cir.ptr<!cir.record<struct -// CIR-SAME: "IncompleteS" incomplete>>>, ["p"] +// CIR-NEXT: cir.alloca !cir.ptr<!ty_IncompleteS>, !cir.ptr<!cir.ptr<!ty_IncompleteS>>, ["p"] {alignment = 8 : i64} // CIR-NEXT: cir.return // LLVM: define void @f() @@ -101,9 +101,7 @@ void f2(void) { } // CIR: cir.func @f2() -// CIR-NEXT: cir.alloca !cir.record<struct "CompleteS" {!s32i, !s8i}>, -// CIR-SAME: !cir.ptr<!cir.record<struct "CompleteS" {!s32i, !s8i}>>, -// CIR-SAME: ["s"] {alignment = 4 : i64} +// CIR-NEXT: cir.alloca !ty_CompleteS, !cir.ptr<!ty_CompleteS>, ["s"] {alignment = 4 : i64} // CIR-NEXT: cir.return // LLVM: define void @f2() diff --git a/clang/test/CIR/CodeGen/struct.cpp b/clang/test/CIR/CodeGen/struct.cpp index 6197340a7d36b..71f8eef43f054 100644 --- a/clang/test/CIR/CodeGen/struct.cpp +++ b/clang/test/CIR/CodeGen/struct.cpp @@ -8,7 +8,7 @@ struct IncompleteS; IncompleteS *p; -// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!cir.record<struct "IncompleteS" incomplete>> +// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!ty_IncompleteS> // LLVM: @p = dso_local global ptr null // OGCG: @p = global ptr null, align 8 @@ -17,8 +17,7 @@ void f(void) { } // CIR: cir.func @f() -// CIR-NEXT: cir.alloca !cir.ptr<!cir.record<struct "IncompleteS" incomplete>>, -// CIR-SAME: !cir.ptr<!cir.ptr<!cir.record<struct "IncompleteS" incomplete>>>, ["p"] +// CIR-NEXT: cir.alloca !cir.ptr<!ty_IncompleteS>, !cir.ptr<!cir.ptr<!ty_IncompleteS>>, ["p"] // CIR-NEXT: cir.return // LLVM: define void @f() diff --git a/clang/test/CIR/CodeGen/typedef.c b/clang/test/CIR/CodeGen/typedef.c index 17fce13abf38a..ad0000730e311 100644 --- a/clang/test/CIR/CodeGen/typedef.c +++ b/clang/test/CIR/CodeGen/typedef.c @@ -11,9 +11,7 @@ void local_typedef(void) { } // CIR: cir.func @local_typedef() -// CIR: cir.alloca !cir.record<struct "Struct" {!s32i}>, -// CIR-SAME: !cir.ptr<!cir.record<struct "Struct" {!s32i}>>, ["s"] -// CIR-SAME: {alignment = 4 : i64} +// CIR: cir.alloca !ty_Struct, !cir.ptr<!ty_Struct>, ["s"] {alignment = 4 : i64} // CIR: cir.return // LLVM: %struct.Struct = type { i32 } diff --git a/clang/test/CIR/CodeGen/union.c b/clang/test/CIR/CodeGen/union.c index 075d0d2315508..c9b8e7e9e2908 100644 --- a/clang/test/CIR/CodeGen/union.c +++ b/clang/test/CIR/CodeGen/union.c @@ -7,7 +7,7 @@ union IncompleteU *p; -// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!cir.record<union "IncompleteU" incomplete>> +// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!ty_IncompleteU> // LLVM: @p = dso_local global ptr null // OGCG: @p = global ptr null, align 8 @@ -16,8 +16,7 @@ void f(void) { } // CIR: cir.func @f() -// CIR-NEXT: cir.alloca !cir.ptr<!cir.record<union "IncompleteU" incomplete>>, -// CIR-SAME: !cir.ptr<!cir.ptr<!cir.record<union "IncompleteU" incomplete>>>, ["p"] +// CIR-NEXT: cir.alloca !cir.ptr<!ty_IncompleteU>, !cir.ptr<!cir.ptr<!ty_IncompleteU>>, ["p"] // CIR-NEXT: cir.return // LLVM: define void @f() diff --git a/clang/test/CIR/IR/struct.cir b/clang/test/CIR/IR/struct.cir index b6ed1d78b354a..ba9c21890e3ed 100644 --- a/clang/test/CIR/IR/struct.cir +++ b/clang/test/CIR/IR/struct.cir @@ -1,9 +1,15 @@ // RUN: cir-opt %s | FileCheck %s +!ty_S = !cir.record<struct "S" incomplete> +!ty_U = !cir.record<union "U" incomplete> + +// CHECK: !ty_S = !cir.record<struct "S" incomplete> +// CHECK: !ty_U = !cir.record<union "U" incomplete> + module { - cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!cir.record<struct "S" incomplete>> - cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!cir.record<union "U" incomplete>> + cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!ty_S> + cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!ty_U> } -// CHECK: cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!cir.record<struct "S" incomplete>> -// CHECK: cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!cir.record<union "U" incomplete>> +// CHECK: cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!ty_S> +// CHECK: cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!ty_U> >From 46d27067f5cfddc31759f7321a9c90be2f95081f Mon Sep 17 00:00:00 2001 From: Andy Kaylor <akay...@nvidia.com> Date: Tue, 22 Apr 2025 13:37:43 -0700 Subject: [PATCH 2/3] Updated prefix to "rec_" --- clang/lib/CIR/Dialect/IR/CIRDialect.cpp | 4 ++-- clang/test/CIR/CodeGen/struct.c | 24 ++++++++++++------------ clang/test/CIR/CodeGen/struct.cpp | 4 ++-- clang/test/CIR/CodeGen/typedef.c | 2 +- clang/test/CIR/CodeGen/union.c | 4 ++-- clang/test/CIR/IR/struct.cir | 16 ++++++++-------- 6 files changed, 27 insertions(+), 27 deletions(-) diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp index 4fb40d290189a..3cd17053a52ba 100644 --- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp +++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp @@ -36,9 +36,9 @@ struct CIROpAsmDialectInterface : public OpAsmDialectInterface { if (auto recordType = dyn_cast<cir::RecordType>(type)) { StringAttr nameAttr = recordType.getName(); if (!nameAttr) - os << "ty_anon_" << recordType.getKindAsStr(); + os << "rec_anon_" << recordType.getKindAsStr(); else - os << "ty_" << nameAttr.getValue(); + os << "rec_" << nameAttr.getValue(); return AliasResult::OverridableAlias; } if (auto intType = dyn_cast<cir::IntType>(type)) { diff --git a/clang/test/CIR/CodeGen/struct.c b/clang/test/CIR/CodeGen/struct.c index 9bd3d74a64084..f3fe20eccaab3 100644 --- a/clang/test/CIR/CodeGen/struct.c +++ b/clang/test/CIR/CodeGen/struct.c @@ -7,12 +7,12 @@ // For LLVM IR checks, the structs are defined before the variables, so these // checks are at the top. -// CIR-DAG: !ty_IncompleteS = !cir.record<struct "IncompleteS" incomplete> -// CIR-DAG: !ty_CompleteS = !cir.record<struct "CompleteS" {!s32i, !s8i}> -// CIR-DAG: !ty_OuterS = !cir.record<struct "OuterS" {!ty_InnerS, !s32i}> -// CIR-DAG: !ty_InnerS = !cir.record<struct "InnerS" {!s32i, !s8i}> -// CIR-DAG: !ty_PackedS = !cir.record<struct "PackedS" packed {!s32i, !s8i}> -// CIR-DAG: !ty_PackedAndPaddedS = !cir.record<struct "PackedAndPaddedS" packed padded {!s32i, !s8i, !u8i}> +// CIR-DAG: !rec_IncompleteS = !cir.record<struct "IncompleteS" incomplete> +// CIR-DAG: !rec_CompleteS = !cir.record<struct "CompleteS" {!s32i, !s8i}> +// CIR-DAG: !rec_OuterS = !cir.record<struct "OuterS" {!ty_InnerS, !s32i}> +// CIR-DAG: !rec_InnerS = !cir.record<struct "InnerS" {!s32i, !s8i}> +// CIR-DAG: !rec_PackedS = !cir.record<struct "PackedS" packed {!s32i, !s8i}> +// CIR-DAG: !rec_PackedAndPaddedS = !cir.record<struct "PackedAndPaddedS" packed padded {!s32i, !s8i, !u8i}> // LLVM-DAG: %struct.CompleteS = type { i32, i8 } // LLVM-DAG: %struct.OuterS = type { %struct.InnerS, i32 } // LLVM-DAG: %struct.InnerS = type { i32, i8 } @@ -36,7 +36,7 @@ struct CompleteS { char b; } cs; -// CIR: cir.global external @cs = #cir.zero : !ty_CompleteS +// CIR: cir.global external @cs = #cir.zero : !rec_CompleteS // LLVM-DAG: @cs = dso_local global %struct.CompleteS zeroinitializer // OGCG-DAG: @cs = global %struct.CompleteS zeroinitializer, align 4 @@ -52,7 +52,7 @@ struct OuterS { struct OuterS os; -// CIR: cir.global external @os = #cir.zero : !ty_OuterS +// CIR: cir.global external @os = #cir.zero : !rec_OuterS // LLVM-DAG: @os = dso_local global %struct.OuterS zeroinitializer // OGCG-DAG: @os = global %struct.OuterS zeroinitializer, align 4 @@ -64,7 +64,7 @@ struct PackedS { char a1; } ps; -// CIR: cir.global external @ps = #cir.zero : !ty_PackedS +// CIR: cir.global external @ps = #cir.zero : !rec_PackedS // LLVM-DAG: @ps = dso_local global %struct.PackedS zeroinitializer // OGCG-DAG: @ps = global %struct.PackedS zeroinitializer, align 1 @@ -73,7 +73,7 @@ struct PackedAndPaddedS { char b1; } __attribute__((aligned(2))) pps; -// CIR: cir.global external @pps = #cir.zero : !ty_PackedAndPaddedS +// CIR: cir.global external @pps = #cir.zero : !rec_PackedAndPaddedS // LLVM-DAG: @pps = dso_local global %struct.PackedAndPaddedS zeroinitializer // OGCG-DAG: @pps = global %struct.PackedAndPaddedS zeroinitializer, align 2 @@ -84,7 +84,7 @@ void f(void) { } // CIR: cir.func @f() -// CIR-NEXT: cir.alloca !cir.ptr<!ty_IncompleteS>, !cir.ptr<!cir.ptr<!ty_IncompleteS>>, ["p"] {alignment = 8 : i64} +// CIR-NEXT: cir.alloca !cir.ptr<!rec_IncompleteS>, !cir.ptr<!cir.ptr<!rec_IncompleteS>>, ["p"] {alignment = 8 : i64} // CIR-NEXT: cir.return // LLVM: define void @f() @@ -101,7 +101,7 @@ void f2(void) { } // CIR: cir.func @f2() -// CIR-NEXT: cir.alloca !ty_CompleteS, !cir.ptr<!ty_CompleteS>, ["s"] {alignment = 4 : i64} +// CIR-NEXT: cir.alloca !rec_CompleteS, !cir.ptr<!rec_CompleteS>, ["s"] {alignment = 4 : i64} // CIR-NEXT: cir.return // LLVM: define void @f2() diff --git a/clang/test/CIR/CodeGen/struct.cpp b/clang/test/CIR/CodeGen/struct.cpp index 71f8eef43f054..c54eca20840b5 100644 --- a/clang/test/CIR/CodeGen/struct.cpp +++ b/clang/test/CIR/CodeGen/struct.cpp @@ -8,7 +8,7 @@ struct IncompleteS; IncompleteS *p; -// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!ty_IncompleteS> +// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!rec_IncompleteS> // LLVM: @p = dso_local global ptr null // OGCG: @p = global ptr null, align 8 @@ -17,7 +17,7 @@ void f(void) { } // CIR: cir.func @f() -// CIR-NEXT: cir.alloca !cir.ptr<!ty_IncompleteS>, !cir.ptr<!cir.ptr<!ty_IncompleteS>>, ["p"] +// CIR-NEXT: cir.alloca !cir.ptr<!rec_IncompleteS>, !cir.ptr<!cir.ptr<!rec_IncompleteS>>, ["p"] // CIR-NEXT: cir.return // LLVM: define void @f() diff --git a/clang/test/CIR/CodeGen/typedef.c b/clang/test/CIR/CodeGen/typedef.c index ad0000730e311..a87e6ffb1843a 100644 --- a/clang/test/CIR/CodeGen/typedef.c +++ b/clang/test/CIR/CodeGen/typedef.c @@ -11,7 +11,7 @@ void local_typedef(void) { } // CIR: cir.func @local_typedef() -// CIR: cir.alloca !ty_Struct, !cir.ptr<!ty_Struct>, ["s"] {alignment = 4 : i64} +// CIR: cir.alloca !rec_Struct, !cir.ptr<!rec_Struct>, ["s"] {alignment = 4 : i64} // CIR: cir.return // LLVM: %struct.Struct = type { i32 } diff --git a/clang/test/CIR/CodeGen/union.c b/clang/test/CIR/CodeGen/union.c index c9b8e7e9e2908..c4db37f835add 100644 --- a/clang/test/CIR/CodeGen/union.c +++ b/clang/test/CIR/CodeGen/union.c @@ -7,7 +7,7 @@ union IncompleteU *p; -// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!ty_IncompleteU> +// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!rec_IncompleteU> // LLVM: @p = dso_local global ptr null // OGCG: @p = global ptr null, align 8 @@ -16,7 +16,7 @@ void f(void) { } // CIR: cir.func @f() -// CIR-NEXT: cir.alloca !cir.ptr<!ty_IncompleteU>, !cir.ptr<!cir.ptr<!ty_IncompleteU>>, ["p"] +// CIR-NEXT: cir.alloca !cir.ptr<!rec_IncompleteU>, !cir.ptr<!cir.ptr<!rec_IncompleteU>>, ["p"] // CIR-NEXT: cir.return // LLVM: define void @f() diff --git a/clang/test/CIR/IR/struct.cir b/clang/test/CIR/IR/struct.cir index ba9c21890e3ed..7f0ce07631182 100644 --- a/clang/test/CIR/IR/struct.cir +++ b/clang/test/CIR/IR/struct.cir @@ -1,15 +1,15 @@ // RUN: cir-opt %s | FileCheck %s -!ty_S = !cir.record<struct "S" incomplete> -!ty_U = !cir.record<union "U" incomplete> +!rec_S = !cir.record<struct "S" incomplete> +!rec_U = !cir.record<union "U" incomplete> -// CHECK: !ty_S = !cir.record<struct "S" incomplete> -// CHECK: !ty_U = !cir.record<union "U" incomplete> +// CHECK: !rec_S = !cir.record<struct "S" incomplete> +// CHECK: !rec_U = !cir.record<union "U" incomplete> module { - cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!ty_S> - cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!ty_U> + cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!rec_S> + cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!rec_U> } -// CHECK: cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!ty_S> -// CHECK: cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!ty_U> +// CHECK: cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!rec_S> +// CHECK: cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!rec_U> >From c9b557b449e303e8ec94aa04e2d7e917d1f66645 Mon Sep 17 00:00:00 2001 From: Andy Kaylor <akay...@nvidia.com> Date: Tue, 22 Apr 2025 14:20:12 -0700 Subject: [PATCH 3/3] Update struct.c test after rebase --- clang/test/CIR/CodeGen/struct.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/clang/test/CIR/CodeGen/struct.c b/clang/test/CIR/CodeGen/struct.c index f3fe20eccaab3..c91a14e0637c1 100644 --- a/clang/test/CIR/CodeGen/struct.c +++ b/clang/test/CIR/CodeGen/struct.c @@ -9,7 +9,7 @@ // checks are at the top. // CIR-DAG: !rec_IncompleteS = !cir.record<struct "IncompleteS" incomplete> // CIR-DAG: !rec_CompleteS = !cir.record<struct "CompleteS" {!s32i, !s8i}> -// CIR-DAG: !rec_OuterS = !cir.record<struct "OuterS" {!ty_InnerS, !s32i}> +// CIR-DAG: !rec_OuterS = !cir.record<struct "OuterS" {!rec_InnerS, !s32i}> // CIR-DAG: !rec_InnerS = !cir.record<struct "InnerS" {!s32i, !s8i}> // CIR-DAG: !rec_PackedS = !cir.record<struct "PackedS" packed {!s32i, !s8i}> // CIR-DAG: !rec_PackedAndPaddedS = !cir.record<struct "PackedAndPaddedS" packed padded {!s32i, !s8i, !u8i}> @@ -26,8 +26,7 @@ struct IncompleteS *p; -// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!cir.record<struct -// CIR-SAME: "IncompleteS" incomplete>> +// CIR: cir.global external @p = #cir.ptr<null> : !cir.ptr<!rec_IncompleteS> // LLVM-DAG: @p = dso_local global ptr null // OGCG-DAG: @p = global ptr null, align 8 @@ -158,7 +157,7 @@ char f4(int a, struct CompleteS *p) { return p->b; } -// CIR: cir.func @f4(%[[ARG_A:.*]]: !s32i {{.*}}, %[[ARG_P:.*]]: !cir.ptr<!cir.record<struct "CompleteS" {!s32i, !s8i}>> +// CIR: cir.func @f4(%[[ARG_A:.*]]: !s32i {{.*}}, %[[ARG_P:.*]]: !cir.ptr<!rec_CompleteS> // CIR-NEXT: %[[A_ADDR:.*]] = cir.alloca {{.*}} ["a", init] {alignment = 4 : i64} // CIR-NEXT: %[[P_ADDR:.*]] = cir.alloca {{.*}} ["p", init] {alignment = 8 : i64} // CIR-NEXT: %[[RETVAL_ADDR:.*]] = cir.alloca {{.*}} ["__retval"] {alignment = 1 : i64} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits