Skip to content

Commit d07ce82

Browse files
committed
[CIR] Use optional type for function return type
Move from a list of return types with 0 or 1 element to an optional type.
1 parent f59cbb2 commit d07ce82

File tree

11 files changed

+80
-50
lines changed

11 files changed

+80
-50
lines changed

clang/include/clang/CIR/Dialect/IR/CIRTypes.td

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -372,23 +372,25 @@ def CIR_VectorType : CIR_Type<"Vector", "vector",
372372
def CIR_FuncType : CIR_Type<"Func", "func"> {
373373
let summary = "CIR function type";
374374
let description = [{
375-
The `!cir.func` is a function type. It consists of a single return type, a
376-
list of parameter types and can optionally be variadic.
375+
The `!cir.func` is a function type. It consists of an optional return type,
376+
a list of parameter types and can optionally be variadic.
377377

378378
Example:
379379

380380
```mlir
381+
!cir.func<()>
381382
!cir.func<!bool ()>
382383
!cir.func<(!s8i, !s8i)>
383384
!cir.func<!s32i (!s8i, !s8i)>
384385
!cir.func<!s32i (!s32i, ...)>
385386
```
386387
}];
387388

388-
let parameters = (ins ArrayRefParameter<"mlir::Type">:$inputs, ArrayRefParameter<"mlir::Type">:$returnTypes,
389+
let parameters = (ins ArrayRefParameter<"mlir::Type">:$inputs,
390+
OptionalParameter<"mlir::Type">:$optionalReturnType,
389391
"bool":$varArg);
390392
let assemblyFormat = [{
391-
`<` $returnTypes ` ` `(` custom<FuncTypeArgs>($inputs, $varArg) `>`
393+
`<` ($optionalReturnType^ ` `)? `(` custom<FuncTypeArgs>($inputs, $varArg) `>`
392394
}];
393395

394396
let builders = [
@@ -397,8 +399,8 @@ def CIR_FuncType : CIR_Type<"Func", "func"> {
397399
"llvm::ArrayRef<mlir::Type>":$inputs, "mlir::Type":$returnType,
398400
CArg<"bool", "false">:$isVarArg), [{
399401
return $_get(returnType.getContext(), inputs,
400-
::mlir::isa<::cir::VoidType>(returnType) ? llvm::ArrayRef<mlir::Type>{}
401-
: llvm::ArrayRef{returnType},
402+
mlir::isa<cir::VoidType>(returnType) ? nullptr
403+
: returnType,
402404
isVarArg);
403405
}]>
404406
];
@@ -417,6 +419,10 @@ def CIR_FuncType : CIR_Type<"Func", "func"> {
417419
/// explicit !cir.void
418420
mlir::Type getReturnType() const;
419421

422+
/// Returns the result type of the function as an ArrayRef, enabling better
423+
/// integration with generic MLIR utilities.
424+
llvm::ArrayRef<mlir::Type> getReturnTypes() const;
425+
420426
/// Returns whether the function returns void.
421427
bool isVoid() const;
422428

clang/lib/CIR/Dialect/IR/CIRTypes.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -963,16 +963,26 @@ void printFuncTypeArgs(mlir::AsmPrinter &p, mlir::ArrayRef<mlir::Type> params,
963963
mlir::Type FuncType::getReturnType() const {
964964
if (isVoid())
965965
return cir::VoidType::get(getContext());
966-
return static_cast<detail::FuncTypeStorage *>(getImpl())->returnTypes.front();
966+
return static_cast<detail::FuncTypeStorage *>(getImpl())->optionalReturnType;
967967
}
968968

969+
/// Returns the result type of the function as an ArrayRef, enabling better
970+
/// integration with generic MLIR utilities.
971+
llvm::ArrayRef<mlir::Type> FuncType::getReturnTypes() const {
972+
if (isVoid())
973+
return {};
974+
return static_cast<detail::FuncTypeStorage *>(getImpl())->optionalReturnType;
975+
}
976+
977+
// Whether the function returns void
969978
bool FuncType::isVoid() const {
970-
auto rt = static_cast<detail::FuncTypeStorage *>(getImpl())->returnTypes;
971-
assert(rt.empty() ||
972-
!mlir::isa<cir::VoidType>(rt.front()) &&
979+
auto rt =
980+
static_cast<detail::FuncTypeStorage *>(getImpl())->optionalReturnType;
981+
assert(!rt ||
982+
!mlir::isa<cir::VoidType>(rt) &&
973983
"The return type for a function returning void should be empty "
974984
"instead of a real !cir.void");
975-
return rt.empty();
985+
return !rt;
976986
}
977987

978988
//===----------------------------------------------------------------------===//

clang/test/CIR/CodeGen/fun-ptr.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ int foo(Data* d) {
5555
return f(d);
5656
}
5757

58-
// CIR: cir.func private {{@.*test.*}}() -> !cir.ptr<!cir.func<!void ()>>
58+
// CIR: cir.func private {{@.*test.*}}() -> !cir.ptr<!cir.func<()>>
5959
// CIR: cir.func {{@.*bar.*}}()
60-
// CIR: [[RET:%.*]] = cir.call {{@.*test.*}}() : () -> !cir.ptr<!cir.func<!void ()>>
61-
// CIR: cir.call [[RET]]() : (!cir.ptr<!cir.func<!void ()>>) -> ()
60+
// CIR: [[RET:%.*]] = cir.call {{@.*test.*}}() : () -> !cir.ptr<!cir.func<()>>
61+
// CIR: cir.call [[RET]]() : (!cir.ptr<!cir.func<()>>) -> ()
6262
// CIR: cir.return
6363

6464
// LLVM: declare ptr {{@.*test.*}}()

clang/test/CIR/CodeGen/gnu-extension.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ void bar(void) {
1515
}
1616

1717
//CHECK: cir.func @bar()
18-
//CHECK: {{.*}} = cir.get_global @bar : !cir.ptr<!cir.func<!void ()>>
18+
//CHECK: {{.*}} = cir.get_global @bar : !cir.ptr<!cir.func<()>>
1919
//CHECK: cir.return

clang/test/CIR/CodeGen/member-init-struct.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ C a, b(x), c(0, 2);
3434
// CHECK: %[[VAL_8:.*]] = cir.get_member %[[VAL_2]][2] {name = "d"} : !cir.ptr<!ty_C> -> !cir.ptr<!cir.array<!s32i x 10>>
3535
// CHECK: %[[VAL_9:.*]] = cir.const {{.*}} : !cir.array<!s32i x 10>
3636
// CHECK: cir.store %[[VAL_9]], %[[VAL_8]] : !cir.array<!s32i x 10>, !cir.ptr<!cir.array<!s32i x 10>>
37-
// CHECK: %[[VAL_10:.*]] = cir.get_member %[[VAL_2]][4] {name = "e"} : !cir.ptr<!ty_C> -> !cir.ptr<!cir.method<!cir.func<!void ()> in !ty_C>>
38-
// CHECK: %[[VAL_11:.*]] = cir.const #cir.method<null> : !cir.method<!cir.func<!void ()> in !ty_C>
39-
// CHECK: cir.store %[[VAL_11]], %[[VAL_10]] : !cir.method<!cir.func<!void ()> in !ty_C>, !cir.ptr<!cir.method<!cir.func<!void ()> in !ty_C>>
40-
// CHECK: cir.return
37+
// CHECK: %[[VAL_10:.*]] = cir.get_member %[[VAL_2]][4] {name = "e"} : !cir.ptr<!ty_C> -> !cir.ptr<!cir.method<!cir.func<()> in !ty_C>>
38+
// CHECK: %[[VAL_11:.*]] = cir.const #cir.method<null> : !cir.method<!cir.func<()> in !ty_C>
39+
// CHECK: cir.store %[[VAL_11]], %[[VAL_10]] : !cir.method<!cir.func<()> in !ty_C>, !cir.ptr<!cir.method<!cir.func<()> in !ty_C>>
40+
// CHECK: cir.return

clang/test/CIR/CodeGen/multi-vtable.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,9 @@ int main() {
7474

7575
// CIR: cir.func @main() -> !s32i extra(#fn_attr) {
7676

77-
// CIR: %{{[0-9]+}} = cir.vtable.address_point( %{{[0-9]+}} : !cir.ptr<!cir.ptr<!cir.func<!void (!cir.ptr<!ty_Mother>)>>>, vtable_index = 0, address_point_index = 0) : !cir.ptr<!cir.ptr<!cir.func<!void (!cir.ptr<!ty_Mother>)>>>
77+
// CIR: %{{[0-9]+}} = cir.vtable.address_point( %{{[0-9]+}} : !cir.ptr<!cir.ptr<!cir.func<(!cir.ptr<!ty_Mother>)>>>, vtable_index = 0, address_point_index = 0) : !cir.ptr<!cir.ptr<!cir.func<(!cir.ptr<!ty_Mother>)>>>
7878

79-
// CIR: %{{[0-9]+}} = cir.vtable.address_point( %{{[0-9]+}} : !cir.ptr<!cir.ptr<!cir.func<!void (!cir.ptr<!ty_Child>)>>>, vtable_index = 0, address_point_index = 0) : !cir.ptr<!cir.ptr<!cir.func<!void (!cir.ptr<!ty_Child>)>>>
79+
// CIR: %{{[0-9]+}} = cir.vtable.address_point( %{{[0-9]+}} : !cir.ptr<!cir.ptr<!cir.func<(!cir.ptr<!ty_Child>)>>>, vtable_index = 0, address_point_index = 0) : !cir.ptr<!cir.ptr<!cir.func<(!cir.ptr<!ty_Child>)>>>
8080

8181
// CIR: }
8282

clang/test/CIR/CodeGen/no-proto-fun-ptr.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ void check_noproto_ptr() {
77
}
88

99
// CHECK: cir.func no_proto @check_noproto_ptr()
10-
// CHECK: [[ALLOC:%.*]] = cir.alloca !cir.ptr<!cir.func<!void ()>>, !cir.ptr<!cir.ptr<!cir.func<!void ()>>>, ["fun", init] {alignment = 8 : i64}
11-
// CHECK: [[GGO:%.*]] = cir.get_global @empty : !cir.ptr<!cir.func<!void ()>>
12-
// CHECK: cir.store [[GGO]], [[ALLOC]] : !cir.ptr<!cir.func<!void ()>>, !cir.ptr<!cir.ptr<!cir.func<!void ()>>>
10+
// CHECK: [[ALLOC:%.*]] = cir.alloca !cir.ptr<!cir.func<()>>, !cir.ptr<!cir.ptr<!cir.func<()>>>, ["fun", init] {alignment = 8 : i64}
11+
// CHECK: [[GGO:%.*]] = cir.get_global @empty : !cir.ptr<!cir.func<()>>
12+
// CHECK: cir.store [[GGO]], [[ALLOC]] : !cir.ptr<!cir.func<()>>, !cir.ptr<!cir.ptr<!cir.func<()>>>
1313
// CHECK: cir.return
1414

1515
void empty(void) {}
@@ -20,8 +20,8 @@ void buz() {
2020
}
2121

2222
// CHECK: cir.func no_proto @buz()
23-
// CHECK: [[FNPTR_ALLOC:%.*]] = cir.alloca !cir.ptr<!cir.func<!void (...)>>, !cir.ptr<!cir.ptr<!cir.func<!void (...)>>>, ["func"] {alignment = 8 : i64}
24-
// CHECK: [[FNPTR:%.*]] = cir.load deref [[FNPTR_ALLOC]] : !cir.ptr<!cir.ptr<!cir.func<!void (...)>>>, !cir.ptr<!cir.func<!void (...)>>
25-
// CHECK: [[CAST:%.*]] = cir.cast(bitcast, %1 : !cir.ptr<!cir.func<!void (...)>>), !cir.ptr<!cir.func<!void ()>>
26-
// CHECK: cir.call [[CAST]]() : (!cir.ptr<!cir.func<!void ()>>) -> ()
23+
// CHECK: [[FNPTR_ALLOC:%.*]] = cir.alloca !cir.ptr<!cir.func<(...)>>, !cir.ptr<!cir.ptr<!cir.func<(...)>>>, ["func"] {alignment = 8 : i64}
24+
// CHECK: [[FNPTR:%.*]] = cir.load deref [[FNPTR_ALLOC]] : !cir.ptr<!cir.ptr<!cir.func<(...)>>>, !cir.ptr<!cir.func<(...)>>
25+
// CHECK: [[CAST:%.*]] = cir.cast(bitcast, %1 : !cir.ptr<!cir.func<(...)>>), !cir.ptr<!cir.func<()>>
26+
// CHECK: cir.call [[CAST]]() : (!cir.ptr<!cir.func<()>>) -> ()
2727
// CHECK: cir.return

clang/test/CIR/CodeGen/pointer-arith-ext.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ void *f4_1(void *a, int b) { return (a -= b); }
5050

5151
FP f5(FP a, int b) { return a + b; }
5252
// CIR-LABEL: f5
53-
// CIR: %[[PTR:.*]] = cir.load {{.*}} : !cir.ptr<!cir.ptr<!cir.func<!void ()>>>, !cir.ptr<!cir.func<!void ()>>
53+
// CIR: %[[PTR:.*]] = cir.load {{.*}} : !cir.ptr<!cir.ptr<!cir.func<()>>>, !cir.ptr<!cir.func<()>>
5454
// CIR: %[[STRIDE:.*]] = cir.load {{.*}} : !cir.ptr<!s32i>, !s32i
55-
// CIR: cir.ptr_stride(%[[PTR]] : !cir.ptr<!cir.func<!void ()>>, %[[STRIDE]] : !s32i)
55+
// CIR: cir.ptr_stride(%[[PTR]] : !cir.ptr<!cir.func<()>>, %[[STRIDE]] : !s32i)
5656

5757
// LLVM-LABEL: f5
5858
// LLVM: %[[PTR:.*]] = load ptr, ptr {{.*}}, align 8
@@ -67,10 +67,10 @@ FP f6_1(int a, FP b) { return (a += b); }
6767

6868
FP f7(FP a, int b) { return a - b; }
6969
// CIR-LABEL: f7
70-
// CIR: %[[PTR:.*]] = cir.load {{.*}} : !cir.ptr<!cir.ptr<!cir.func<!void ()>>>, !cir.ptr<!cir.func<!void ()>>
70+
// CIR: %[[PTR:.*]] = cir.load {{.*}} : !cir.ptr<!cir.ptr<!cir.func<()>>>, !cir.ptr<!cir.func<()>>
7171
// CIR: %[[STRIDE:.*]] = cir.load {{.*}} : !cir.ptr<!s32i>, !s32i
7272
// CIR: %[[SUB:.*]] = cir.unary(minus, %[[STRIDE]]) : !s32i, !s32i
73-
// CIR: cir.ptr_stride(%[[PTR]] : !cir.ptr<!cir.func<!void ()>>, %[[SUB]] : !s32i)
73+
// CIR: cir.ptr_stride(%[[PTR]] : !cir.ptr<!cir.func<()>>, %[[SUB]] : !s32i)
7474

7575
// LLVM-LABEL: f7
7676
// LLVM: %[[PTR:.*]] = load ptr, ptr {{.*}}, align 8

clang/test/CIR/CodeGen/pointer-to-member-func.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,32 +11,32 @@ auto make_non_virtual() -> void (Foo::*)(int) {
1111
return &Foo::m1;
1212
}
1313

14-
// CHECK-LABEL: cir.func @_Z16make_non_virtualv() -> !cir.method<!cir.func<!void (!s32i)> in !ty_Foo>
15-
// CHECK: %{{.+}} = cir.const #cir.method<@_ZN3Foo2m1Ei> : !cir.method<!cir.func<!void (!s32i)> in !ty_Foo>
14+
// CHECK-LABEL: cir.func @_Z16make_non_virtualv() -> !cir.method<!cir.func<(!s32i)> in !ty_Foo>
15+
// CHECK: %{{.+}} = cir.const #cir.method<@_ZN3Foo2m1Ei> : !cir.method<!cir.func<(!s32i)> in !ty_Foo>
1616
// CHECK: }
1717

1818
auto make_virtual() -> void (Foo::*)(int) {
1919
return &Foo::m3;
2020
}
2121

22-
// CHECK-LABEL: cir.func @_Z12make_virtualv() -> !cir.method<!cir.func<!void (!s32i)> in !ty_Foo>
23-
// CHECK: %{{.+}} = cir.const #cir.method<vtable_offset = 8> : !cir.method<!cir.func<!void (!s32i)> in !ty_Foo>
22+
// CHECK-LABEL: cir.func @_Z12make_virtualv() -> !cir.method<!cir.func<(!s32i)> in !ty_Foo>
23+
// CHECK: %{{.+}} = cir.const #cir.method<vtable_offset = 8> : !cir.method<!cir.func<(!s32i)> in !ty_Foo>
2424
// CHECK: }
2525

2626
auto make_null() -> void (Foo::*)(int) {
2727
return nullptr;
2828
}
2929

30-
// CHECK-LABEL: cir.func @_Z9make_nullv() -> !cir.method<!cir.func<!void (!s32i)> in !ty_Foo>
31-
// CHECK: %{{.+}} = cir.const #cir.method<null> : !cir.method<!cir.func<!void (!s32i)> in !ty_Foo>
30+
// CHECK-LABEL: cir.func @_Z9make_nullv() -> !cir.method<!cir.func<(!s32i)> in !ty_Foo>
31+
// CHECK: %{{.+}} = cir.const #cir.method<null> : !cir.method<!cir.func<(!s32i)> in !ty_Foo>
3232
// CHECK: }
3333

3434
void call(Foo *obj, void (Foo::*func)(int), int arg) {
3535
(obj->*func)(arg);
3636
}
3737

3838
// CHECK-LABEL: cir.func @_Z4callP3FooMS_FviEi
39-
// CHECK: %[[CALLEE:.+]], %[[THIS:.+]] = cir.get_method %{{.+}}, %{{.+}} : (!cir.method<!cir.func<!void (!s32i)> in !ty_Foo>, !cir.ptr<!ty_Foo>) -> (!cir.ptr<!cir.func<!void (!cir.ptr<!void>, !s32i)>>, !cir.ptr<!void>)
39+
// CHECK: %[[CALLEE:.+]], %[[THIS:.+]] = cir.get_method %{{.+}}, %{{.+}} : (!cir.method<!cir.func<(!s32i)> in !ty_Foo>, !cir.ptr<!ty_Foo>) -> (!cir.ptr<!cir.func<(!cir.ptr<!void>, !s32i)>>, !cir.ptr<!void>)
4040
// CHECK-NEXT: %[[#ARG:]] = cir.load %{{.+}} : !cir.ptr<!s32i>, !s32i
41-
// CHECK-NEXT: cir.call %[[CALLEE]](%[[THIS]], %[[#ARG]]) : (!cir.ptr<!cir.func<!void (!cir.ptr<!void>, !s32i)>>, !cir.ptr<!void>, !s32i) -> ()
41+
// CHECK-NEXT: cir.call %[[CALLEE]](%[[THIS]], %[[#ARG]]) : (!cir.ptr<!cir.func<(!cir.ptr<!void>, !s32i)>>, !cir.ptr<!void>, !s32i) -> ()
4242
// CHECK: }

clang/test/CIR/CodeGen/static.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ static Init __ioinit2(false);
4040

4141
// AFTER: module {{.*}} attributes {{.*}}cir.global_ctors = [#cir.global_ctor<"__cxx_global_var_init", 65536>, #cir.global_ctor<"__cxx_global_var_init.1", 65536>]
4242
// AFTER-NEXT: cir.global "private" external @__dso_handle : i8
43-
// AFTER-NEXT: cir.func private @__cxa_atexit(!cir.ptr<!cir.func<!void (!cir.ptr<!void>)>>, !cir.ptr<!void>, !cir.ptr<i8>)
43+
// AFTER-NEXT: cir.func private @__cxa_atexit(!cir.ptr<!cir.func<(!cir.ptr<!void>)>>, !cir.ptr<!void>, !cir.ptr<i8>)
4444
// AFTER-NEXT: cir.func private @_ZN4InitC1Eb(!cir.ptr<!ty_Init>, !cir.bool)
4545
// AFTER-NEXT: cir.func private @_ZN4InitD1Ev(!cir.ptr<!ty_Init>)
4646
// AFTER-NEXT: cir.global "private" internal dsolocal @_ZL8__ioinit = #cir.zero : !ty_Init {alignment = 1 : i64, ast = #cir.var.decl.ast}
@@ -49,23 +49,23 @@ static Init __ioinit2(false);
4949
// AFTER-NEXT: %1 = cir.const #true
5050
// AFTER-NEXT: cir.call @_ZN4InitC1Eb(%0, %1) : (!cir.ptr<!ty_Init>, !cir.bool) -> ()
5151
// AFTER-NEXT: %2 = cir.get_global @_ZL8__ioinit : !cir.ptr<!ty_Init>
52-
// AFTER-NEXT: %3 = cir.get_global @_ZN4InitD1Ev : !cir.ptr<!cir.func<!void (!cir.ptr<!ty_Init>)>>
53-
// AFTER-NEXT: %4 = cir.cast(bitcast, %3 : !cir.ptr<!cir.func<!void (!cir.ptr<!ty_Init>)>>), !cir.ptr<!cir.func<!void (!cir.ptr<!void>)>>
52+
// AFTER-NEXT: %3 = cir.get_global @_ZN4InitD1Ev : !cir.ptr<!cir.func<(!cir.ptr<!ty_Init>)>>
53+
// AFTER-NEXT: %4 = cir.cast(bitcast, %3 : !cir.ptr<!cir.func<(!cir.ptr<!ty_Init>)>>), !cir.ptr<!cir.func<(!cir.ptr<!void>)>>
5454
// AFTER-NEXT: %5 = cir.cast(bitcast, %2 : !cir.ptr<!ty_Init>), !cir.ptr<!void>
5555
// AFTER-NEXT: %6 = cir.get_global @__dso_handle : !cir.ptr<i8>
56-
// AFTER-NEXT: cir.call @__cxa_atexit(%4, %5, %6) : (!cir.ptr<!cir.func<!void (!cir.ptr<!void>)>>, !cir.ptr<!void>, !cir.ptr<i8>) -> ()
56+
// AFTER-NEXT: cir.call @__cxa_atexit(%4, %5, %6) : (!cir.ptr<!cir.func<(!cir.ptr<!void>)>>, !cir.ptr<!void>, !cir.ptr<i8>) -> ()
5757
// AFTER-NEXT: cir.return
5858
// AFTER: cir.global "private" internal dsolocal @_ZL9__ioinit2 = #cir.zero : !ty_Init {alignment = 1 : i64, ast = #cir.var.decl.ast}
5959
// AFTER-NEXT: cir.func internal private @__cxx_global_var_init.1()
6060
// AFTER-NEXT: %0 = cir.get_global @_ZL9__ioinit2 : !cir.ptr<!ty_Init>
6161
// AFTER-NEXT: %1 = cir.const #false
6262
// AFTER-NEXT: cir.call @_ZN4InitC1Eb(%0, %1) : (!cir.ptr<!ty_Init>, !cir.bool) -> ()
6363
// AFTER-NEXT: %2 = cir.get_global @_ZL9__ioinit2 : !cir.ptr<!ty_Init>
64-
// AFTER-NEXT: %3 = cir.get_global @_ZN4InitD1Ev : !cir.ptr<!cir.func<!void (!cir.ptr<!ty_Init>)>>
65-
// AFTER-NEXT: %4 = cir.cast(bitcast, %3 : !cir.ptr<!cir.func<!void (!cir.ptr<!ty_Init>)>>), !cir.ptr<!cir.func<!void (!cir.ptr<!void>)>>
64+
// AFTER-NEXT: %3 = cir.get_global @_ZN4InitD1Ev : !cir.ptr<!cir.func<(!cir.ptr<!ty_Init>)>>
65+
// AFTER-NEXT: %4 = cir.cast(bitcast, %3 : !cir.ptr<!cir.func<(!cir.ptr<!ty_Init>)>>), !cir.ptr<!cir.func<(!cir.ptr<!void>)>>
6666
// AFTER-NEXT: %5 = cir.cast(bitcast, %2 : !cir.ptr<!ty_Init>), !cir.ptr<!void>
6767
// AFTER-NEXT: %6 = cir.get_global @__dso_handle : !cir.ptr<i8>
68-
// AFTER-NEXT: cir.call @__cxa_atexit(%4, %5, %6) : (!cir.ptr<!cir.func<!void (!cir.ptr<!void>)>>, !cir.ptr<!void>, !cir.ptr<i8>) -> ()
68+
// AFTER-NEXT: cir.call @__cxa_atexit(%4, %5, %6) : (!cir.ptr<!cir.func<(!cir.ptr<!void>)>>, !cir.ptr<!void>, !cir.ptr<i8>) -> ()
6969
// AFTER-NEXT: cir.return
7070
// AFTER: cir.func private @_GLOBAL__sub_I_static.cpp()
7171
// AFTER-NEXT: cir.call @__cxx_global_var_init() : () -> ()

0 commit comments

Comments
 (0)