Skip to content

[CIR] Fix dso_local Func/GlobalOp printer and align with llvm format #1666

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 5, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions clang/include/clang/CIR/Dialect/IR/CIROps.td
Original file line number Diff line number Diff line change
Expand Up @@ -2467,7 +2467,7 @@ def GlobalOp : CIR_Op<"global",
OptionalAttr<AnyAttr>:$initial_value,
UnitAttr:$comdat,
UnitAttr:$constant,
UnitAttr:$dsolocal,
UnitAttr:$dso_local,
OptionalAttr<I64Attr>:$alignment,
OptionalAttr<ASTVarDeclInterface>:$ast,
OptionalAttr<StrAttr>:$section,
Expand All @@ -2480,7 +2480,7 @@ def GlobalOp : CIR_Op<"global",
$linkage
(`comdat` $comdat^)?
($tls_model^)?
(`dsolocal` $dsolocal^)?
(`dso_local` $dso_local^)?
(`addrspace` `(` custom<GlobalOpAddrSpace>($addr_space)^ `)`)?
$sym_name
custom<GlobalOpTypeAndInitialValue>($sym_type, $initial_value, $ctorRegion, $dtorRegion)
Expand Down Expand Up @@ -3660,7 +3660,7 @@ def FuncOp : CIR_Op<"func", [
UnitAttr:$coroutine,
UnitAttr:$lambda,
UnitAttr:$no_proto,
UnitAttr:$dsolocal,
UnitAttr:$dso_local,
DefaultValuedAttr<GlobalLinkageKind,
"GlobalLinkageKind::ExternalLinkage">:$linkage,
DefaultValuedAttr<CallingConv,
Expand Down
4 changes: 2 additions & 2 deletions clang/include/clang/CIR/Interfaces/CIROpInterfaces.td
Original file line number Diff line number Diff line change
Expand Up @@ -142,13 +142,13 @@ let cppNamespace = "::cir" in {
InterfaceMethod<"",
"void", "setDSOLocal", (ins "bool":$val), [{}],
/*defaultImplementation=*/[{
$_op.setDsolocal(val);
$_op.setDsoLocal(val);
}]
>,
InterfaceMethod<"",
"bool", "isDSOLocal", (ins), [{}],
/*defaultImplementation=*/[{
return $_op.getDsolocal();
return $_op.getDsoLocal();
}]
>,
InterfaceMethod<"",
Expand Down
12 changes: 7 additions & 5 deletions clang/lib/CIR/Dialect/IR/CIRDialect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2321,7 +2321,7 @@ ParseResult cir::FuncOp::parse(OpAsmParser &parser, OperationState &state) {
auto visNameAttr = getSymVisibilityAttrName(state.name);
auto noProtoNameAttr = getNoProtoAttrName(state.name);
auto visibilityNameAttr = getGlobalVisibilityAttrName(state.name);
auto dsolocalNameAttr = getDsolocalAttrName(state.name);
auto dsoLocalNameAttr = getDsoLocalAttrName(state.name);
auto annotationsNameAttr = getAnnotationsAttrName(state.name);
if (::mlir::succeeded(parser.parseOptionalKeyword(builtinNameAttr.strref())))
state.addAttribute(builtinNameAttr, parser.getBuilder().getUnitAttr());
Expand Down Expand Up @@ -2354,9 +2354,8 @@ ParseResult cir::FuncOp::parse(OpAsmParser &parser, OperationState &state) {
parseVisibilityAttr(parser, cirVisibilityAttr);
state.addAttribute(visibilityNameAttr, cirVisibilityAttr);

// TODO: It is unclear whether this is printed in the pretty-printer
if (parser.parseOptionalKeyword(dsolocalNameAttr).succeeded())
state.addAttribute(dsolocalNameAttr, parser.getBuilder().getUnitAttr());
if (parser.parseOptionalKeyword(dsoLocalNameAttr).succeeded())
state.addAttribute(dsoLocalNameAttr, parser.getBuilder().getUnitAttr());

StringAttr nameAttr;
llvm::SmallVector<OpAsmParser::Argument, 8> arguments;
Expand Down Expand Up @@ -2568,6 +2567,9 @@ void cir::FuncOp::print(OpAsmPrinter &p) {
printVisibilityAttr(p, cirVisibilityAttr);
}

if (getDsoLocal())
p << " dso_local";

// Print function name, signature, and control.
p << ' ';
p.printSymbolName(getSymName());
Expand All @@ -2585,7 +2587,7 @@ void cir::FuncOp::print(OpAsmPrinter &p) {
p, *this,
// These are all omitted since they are custom printed already.
{getAliaseeAttrName(), getBuiltinAttrName(), getCoroutineAttrName(),
getDsolocalAttrName(), getExtraAttrsAttrName(),
getDsoLocalAttrName(), getExtraAttrsAttrName(),
getFunctionTypeAttrName(), getGlobalCtorAttrName(),
getGlobalDtorAttrName(), getLambdaAttrName(), getLinkageAttrName(),
getCallingConvAttrName(), getNoProtoAttrName(),
Expand Down
21 changes: 11 additions & 10 deletions clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2133,18 +2133,19 @@ void CIRToLLVMFuncOpLowering::lowerFuncAttributes(
cir::FuncOp func, bool filterArgAndResAttrs,
SmallVectorImpl<mlir::NamedAttribute> &result) const {
for (auto attr : func->getAttrs()) {
if (attr.getName() == mlir::SymbolTable::getSymbolAttrName() ||
attr.getName() == func.getFunctionTypeAttrName() ||
attr.getName() == getLinkageAttrNameString() ||
attr.getName() == func.getCallingConvAttrName() ||
(filterArgAndResAttrs &&
(attr.getName() == func.getArgAttrsAttrName() ||
attr.getName() == func.getResAttrsAttrName())))
StringRef name = attr.getName();
if (name == mlir::SymbolTable::getSymbolAttrName() ||
name == func.getFunctionTypeAttrName() ||
name == getLinkageAttrNameString() ||
name == func.getCallingConvAttrName() ||
name == func.getDsoLocalAttrName() ||
(filterArgAndResAttrs && (name == func.getArgAttrsAttrName() ||
name == func.getResAttrsAttrName())))
continue;

// `CIRDialectLLVMIRTranslationInterface` requires "cir." prefix for
// dialect specific attributes, rename them.
if (attr.getName() == func.getExtraAttrsAttrName()) {
if (name == func.getExtraAttrsAttrName()) {
std::string cirName = "cir." + func.getExtraAttrsAttrName().str();
attr.setName(mlir::StringAttr::get(getContext(), cirName));

Expand Down Expand Up @@ -2191,7 +2192,7 @@ mlir::LogicalResult CIRToLLVMFuncOpLowering::matchAndRewrite(
mlir::ConversionPatternRewriter &rewriter) const {

auto fnType = op.getFunctionType();
auto isDsoLocal = op.getDsolocal();
auto isDsoLocal = op.getDsoLocal();
mlir::TypeConverter::SignatureConversion signatureConversion(
fnType.getNumInputs());

Expand Down Expand Up @@ -2562,7 +2563,7 @@ mlir::LogicalResult CIRToLLVMGlobalOpLowering::matchAndRewrite(
const auto llvmType =
convertTypeForMemory(*getTypeConverter(), dataLayout, cirSymType);
const auto isConst = op.getConstant();
const auto isDsoLocal = op.getDsolocal();
const auto isDsoLocal = op.getDsoLocal();
const auto linkage = convertLinkage(op.getLinkage());
const auto symbol = op.getSymName();
mlir::Attribute init = op.getInitialValueAttr();
Expand Down
30 changes: 15 additions & 15 deletions clang/test/CIR/CallConvLowering/AArch64/aarch64-cc-structs.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#include <stdint.h>

typedef struct {
short a;
short a;
} LT_64;

typedef struct {
Expand Down Expand Up @@ -67,7 +67,7 @@ EQ_128 ret_eq_128() {
return x;
}

// CHECK: cir.func {{.*@ret_gt_128}}(%arg0: !cir.ptr<!rec_GT_128>
// CHECK: cir.func {{.*@ret_gt_128}}(%arg0: !cir.ptr<!rec_GT_128>
// CHECK-NOT: cir.return {{%.*}}
GT_128 ret_gt_128() {
GT_128 x;
Expand All @@ -77,7 +77,7 @@ GT_128 ret_gt_128() {
typedef struct {
int a;
int b;
int c;
int c;
} S;

// CHECK: cir.func {{.*@retS}}() -> !cir.array<!u64i x 2>
Expand All @@ -90,7 +90,7 @@ typedef struct {
// CHECK: %[[#V5:]] = cir.load{{.*}} %[[#V1]] : !cir.ptr<!cir.array<!u64i x 2>>, !cir.array<!u64i x 2>
// CHECK: cir.return %[[#V5]] : !cir.array<!u64i x 2>

// LLVM: [2 x i64] @retS()
// LLVM: [2 x i64] @retS()
// LLVM: %[[#V1:]] = alloca %struct.S, i64 1, align 4
// LLVM: %[[#V2:]] = alloca [2 x i64], i64 1, align 8
// LLVM: call void @llvm.memcpy.p0.p0.i64(ptr %[[#V2]], ptr %[[#V1]], i64 12, i1 false)
Expand Down Expand Up @@ -142,7 +142,7 @@ void pass_lt_128(LT_128 s) {}
// LLVM: store [2 x i64] %0, ptr %[[#V1]], align 8
void pass_eq_128(EQ_128 s) {}

// CHECK: cir.func @pass_gt_128(%arg0: !cir.ptr<!rec_GT_128>
// CHECK: cir.func dso_local @pass_gt_128(%arg0: !cir.ptr<!rec_GT_128>
// CHECK: %[[#V0:]] = cir.alloca !cir.ptr<!rec_GT_128>, !cir.ptr<!cir.ptr<!rec_GT_128>>, [""] {alignment = 8 : i64}
// CHECK: cir.store{{.*}} %arg0, %[[#V0]] : !cir.ptr<!rec_GT_128>, !cir.ptr<!cir.ptr<!rec_GT_128>>
// CHECK: %[[#V1:]] = cir.load{{.*}} %[[#V0]] : !cir.ptr<!cir.ptr<!rec_GT_128>>, !cir.ptr<!rec_GT_128>
Expand All @@ -153,7 +153,7 @@ void pass_eq_128(EQ_128 s) {}
// LLVM: %[[#V2:]] = load ptr, ptr %[[#V1]], align 8
void pass_gt_128(GT_128 s) {}

// CHECK: cir.func @get_gt_128(%arg0: !cir.ptr<!rec_GT_128> {{.*}}, %arg1: !cir.ptr<!rec_GT_128>
// CHECK: cir.func dso_local @get_gt_128(%arg0: !cir.ptr<!rec_GT_128> {{.*}}, %arg1: !cir.ptr<!rec_GT_128>
// CHECK: %[[#V0:]] = cir.alloca !cir.ptr<!rec_GT_128>, !cir.ptr<!cir.ptr<!rec_GT_128>>, [""] {alignment = 8 : i64}
// CHECK: cir.store{{.*}} %arg1, %[[#V0]] : !cir.ptr<!rec_GT_128>, !cir.ptr<!cir.ptr<!rec_GT_128>>
// CHECK: %[[#V1:]] = cir.load{{.*}} %[[#V0]] : !cir.ptr<!cir.ptr<!rec_GT_128>>, !cir.ptr<!rec_GT_128>
Expand All @@ -170,7 +170,7 @@ GT_128 get_gt_128(GT_128 s) {
return s;
}

// CHECK: cir.func no_proto @call_and_get_gt_128(%arg0: !cir.ptr<!rec_GT_128>
// CHECK: cir.func no_proto dso_local @call_and_get_gt_128(%arg0: !cir.ptr<!rec_GT_128>
// CHECK: %[[#V0:]] = cir.alloca !rec_GT_128, !cir.ptr<!rec_GT_128>, ["tmp"] {alignment = 8 : i64}
// CHECK: %[[#V1:]] = cir.load{{.*}} %arg0 : !cir.ptr<!rec_GT_128>, !rec_GT_128
// CHECK: %[[#V2:]] = cir.alloca !rec_GT_128, !cir.ptr<!rec_GT_128>, [""] {alignment = 8 : i64}
Expand All @@ -194,7 +194,7 @@ GT_128 call_and_get_gt_128() {
s = get_gt_128(s);
return s;
}
// CHECK: cir.func @passS(%arg0: !cir.array<!u64i x 2>
// CHECK: cir.func dso_local @passS(%arg0: !cir.array<!u64i x 2>
// CHECK: %[[#V0:]] = cir.alloca !rec_S, !cir.ptr<!rec_S>, [""] {alignment = 4 : i64}
// CHECK: %[[#V1:]] = cir.alloca !cir.array<!u64i x 2>, !cir.ptr<!cir.array<!u64i x 2>>, ["tmp"] {alignment = 8 : i64}
// CHECK: cir.store{{.*}} %arg0, %[[#V1]] : !cir.array<!u64i x 2>, !cir.ptr<!cir.array<!u64i x 2>>
Expand Down Expand Up @@ -268,7 +268,7 @@ typedef struct {
int a[42];
} CAT;

// CHECK: cir.func @pass_cat(%arg0: !cir.ptr<!rec_CAT>
// CHECK: cir.func dso_local @pass_cat(%arg0: !cir.ptr<!rec_CAT>
// CHECK: %[[#V0:]] = cir.alloca !cir.ptr<!rec_CAT>, !cir.ptr<!cir.ptr<!rec_CAT>>, [""] {alignment = 8 : i64}
// CHECK: cir.store{{.*}} %arg0, %[[#V0]] : !cir.ptr<!rec_CAT>, !cir.ptr<!cir.ptr<!rec_CAT>>
// CHECK: %[[#V1:]] = cir.load{{.*}} %[[#V0]] : !cir.ptr<!cir.ptr<!rec_CAT>>, !cir.ptr<!rec_CAT>
Expand All @@ -290,7 +290,7 @@ typedef struct {
};
} NESTED_U;

// CHECK: cir.func @pass_nested_u(%arg0: !u64i
// CHECK: cir.func dso_local @pass_nested_u(%arg0: !u64i
// CHECK: %[[#V0:]] = cir.alloca !rec_NESTED_U, !cir.ptr<!rec_NESTED_U>, [""] {alignment = 4 : i64}
// CHECK: %[[#V1:]] = cir.cast(integral, %arg0 : !u64i), !u16i
// CHECK: %[[#V2:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_NESTED_U>
Expand All @@ -304,7 +304,7 @@ typedef struct {
// LLVM: ret void
void pass_nested_u(NESTED_U a) {}

// CHECK: cir.func no_proto @call_nested_u()
// CHECK: cir.func no_proto dso_local @call_nested_u()
// CHECK: %[[#V0:]] = cir.alloca !rec_NESTED_U, !cir.ptr<!rec_NESTED_U>
// CHECK: %[[#V1:]] = cir.alloca !u64i, !cir.ptr<!u64i>, ["tmp"]
// CHECK: %[[#V2:]] = cir.load{{.*}} %[[#V0]] : !cir.ptr<!rec_NESTED_U>, !rec_NESTED_U
Expand Down Expand Up @@ -355,7 +355,7 @@ void bar(void) {
PackedS1 y = foo();
}

// CHECK: cir.func @bar
// CHECK: cir.func dso_local @bar
// CHECK: %[[#V0:]] = cir.alloca !rec_PackedS1, !cir.ptr<!rec_PackedS1>, ["y", init]
// CHECK: %[[#V1:]] = cir.alloca !cir.array<!u64i x 2>, !cir.ptr<!cir.array<!u64i x 2>>, ["tmp"]
// CHECK: %[[#V2:]] = cir.call @foo() : () -> !cir.array<!u64i x 2>
Expand Down Expand Up @@ -394,7 +394,7 @@ void qux(void) {
}

// check source of memcpy
// CHECK: cir.func @qux
// CHECK: cir.func dso_local @qux
// CHECK: %[[#V0:]] = cir.alloca !cir.ptr<!rec_PackedS2>, !cir.ptr<!cir.ptr<!rec_PackedS2>>, ["s1", init]
// CHECK: %[[#V1:]] = cir.alloca !u64i, !cir.ptr<!u64i>, ["tmp"]
// CHECK: %[[#V2:]] = cir.get_global @g : !cir.ptr<!cir.array<!rec_PackedS2 x 3>>
Expand All @@ -403,9 +403,9 @@ void qux(void) {
// CHECK: %[[#V5:]] = cir.ptr_stride(%[[#V4]] : !cir.ptr<!rec_PackedS2>, %[[#V3]] : !s32i), !cir.ptr<!rec_PackedS2>
// CHECK: cir.store{{.*}} %[[#V5]], %[[#V0]] : !cir.ptr<!rec_PackedS2>, !cir.ptr<!cir.ptr<!rec_PackedS2>>
// CHECK: %[[#V6:]] = cir.load deref{{.*}} %[[#V0]] : !cir.ptr<!cir.ptr<!rec_PackedS2>>, !cir.ptr<!rec_PackedS2>
// CHECK: %[[#V7:]] = cir.cast(bitcast, %[[#V6]] : !cir.ptr<!rec_PackedS2>), !cir.ptr<!void>
// CHECK: %[[#V7:]] = cir.cast(bitcast, %[[#V6]] : !cir.ptr<!rec_PackedS2>), !cir.ptr<!void>
// CHECK: %[[#V8:]] = cir.const #cir.int<6> : !u64i
// CHECK: cir.libc.memcpy %[[#V8]] bytes from %[[#V7]]
// CHECK: cir.libc.memcpy %[[#V8]] bytes from %[[#V7]]

// Note: GEP emitted by cir might not be the same as LLVM, due to constant folding.
// LLVM: void @qux
Expand Down
24 changes: 12 additions & 12 deletions clang/test/CIR/CallConvLowering/AArch64/basic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,27 +15,27 @@ bool Bool(bool a) {
return Bool(a);
}

// CHECK: cir.func @_Z5UCharh(%arg0: !u8i loc({{.+}})) -> !u8i
// CHECK: cir.func dso_local @_Z5UCharh(%arg0: !u8i loc({{.+}})) -> !u8i
unsigned char UChar(unsigned char c) {
// CHECK: cir.call @_Z5UCharh(%2) : (!u8i) -> !u8i
return UChar(c);
}
// CHECK: cir.func @_Z6UShortt(%arg0: !u16i loc({{.+}})) -> !u16i
// CHECK: cir.func dso_local @_Z6UShortt(%arg0: !u16i loc({{.+}})) -> !u16i
unsigned short UShort(unsigned short s) {
// CHECK: cir.call @_Z6UShortt(%2) : (!u16i) -> !u16i
return UShort(s);
}
// CHECK: cir.func @_Z4UIntj(%arg0: !u32i loc({{.+}})) -> !u32i
// CHECK: cir.func dso_local @_Z4UIntj(%arg0: !u32i loc({{.+}})) -> !u32i
unsigned int UInt(unsigned int i) {
// CHECK: cir.call @_Z4UIntj(%2) : (!u32i) -> !u32i
return UInt(i);
}
// CHECK: cir.func @_Z5ULongm(%arg0: !u64i loc({{.+}})) -> !u64i
// CHECK: cir.func dso_local @_Z5ULongm(%arg0: !u64i loc({{.+}})) -> !u64i
unsigned long ULong(unsigned long l) {
// CHECK: cir.call @_Z5ULongm(%2) : (!u64i) -> !u64i
return ULong(l);
}
// CHECK: cir.func @_Z9ULongLongy(%arg0: !u64i loc({{.+}})) -> !u64i
// CHECK: cir.func dso_local @_Z9ULongLongy(%arg0: !u64i loc({{.+}})) -> !u64i
unsigned long long ULongLong(unsigned long long l) {
// CHECK: cir.call @_Z9ULongLongy(%2) : (!u64i) -> !u64i
return ULongLong(l);
Expand All @@ -44,27 +44,27 @@ unsigned long long ULongLong(unsigned long long l) {

/// Test call conv lowering for trivial signed cases. ///

// CHECK: cir.func @_Z4Chara(%arg0: !s8i loc({{.+}})) -> !s8i
// CHECK: cir.func dso_local @_Z4Chara(%arg0: !s8i loc({{.+}})) -> !s8i
char Char(signed char c) {
// CHECK: cir.call @_Z4Chara(%{{.+}}) : (!s8i) -> !s8i
return Char(c);
}
// CHECK: cir.func @_Z5Shorts(%arg0: !s16i loc({{.+}})) -> !s16i
// CHECK: cir.func dso_local @_Z5Shorts(%arg0: !s16i loc({{.+}})) -> !s16i
short Short(short s) {
// CHECK: cir.call @_Z5Shorts(%{{.+}}) : (!s16i) -> !s16i
return Short(s);
}
// CHECK: cir.func @_Z3Inti(%arg0: !s32i loc({{.+}})) -> !s32i
// CHECK: cir.func dso_local @_Z3Inti(%arg0: !s32i loc({{.+}})) -> !s32i
int Int(int i) {
// CHECK: cir.call @_Z3Inti(%{{.+}}) : (!s32i) -> !s32i
return Int(i);
}
// CHECK: cir.func @_Z4Longl(%arg0: !s64i loc({{.+}})) -> !s64i
// CHECK: cir.func dso_local @_Z4Longl(%arg0: !s64i loc({{.+}})) -> !s64i
long Long(long l) {
// CHECK: cir.call @_Z4Longl(%{{.+}}) : (!s64i) -> !s64i
return Long(l);
}
// CHECK: cir.func @_Z8LongLongx(%arg0: !s64i loc({{.+}})) -> !s64i
// CHECK: cir.func dso_local @_Z8LongLongx(%arg0: !s64i loc({{.+}})) -> !s64i
long long LongLong(long long l) {
// CHECK: cir.call @_Z8LongLongx(%{{.+}}) : (!s64i) -> !s64i
return LongLong(l);
Expand All @@ -73,12 +73,12 @@ long long LongLong(long long l) {

/// Test call conv lowering for floating point. ///

// CHECK: cir.func @_Z5Floatf(%arg0: !cir.float loc({{.+}})) -> !cir.float
// CHECK: cir.func dso_local @_Z5Floatf(%arg0: !cir.float loc({{.+}})) -> !cir.float
float Float(float f) {
// cir.call @_Z5Floatf(%{{.+}}) : (!cir.float) -> !cir.float
return Float(f);
}
// CHECK: cir.func @_Z6Doubled(%arg0: !cir.double loc({{.+}})) -> !cir.double
// CHECK: cir.func dso_local @_Z6Doubled(%arg0: !cir.double loc({{.+}})) -> !cir.double
double Double(double d) {
// cir.call @_Z6Doubled(%{{.+}}) : (!cir.double) -> !cir.double
return Double(d);
Expand Down
4 changes: 2 additions & 2 deletions clang/test/CIR/CallConvLowering/AArch64/ptr-fields.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ typedef struct {

int foo(int x) { return x; }

// CIR: cir.func @passA(%arg0: !u64i
// CIR: cir.func dso_local @passA(%arg0: !u64i
// CIR: %[[#V0:]] = cir.alloca !rec_A, !cir.ptr<!rec_A>, [""] {alignment = 4 : i64}
// CIR: %[[#V1:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_A>), !cir.ptr<!u64i>
// CIR: cir.store{{.*}} %arg0, %[[#V1]] : !u64i, !cir.ptr<!u64i>
Expand All @@ -36,7 +36,7 @@ typedef struct {
S_1* s;
} S_2;

// CIR: cir.func @passB(%arg0: !u64i
// CIR: cir.func dso_local @passB(%arg0: !u64i
// CIR: %[[#V0:]] = cir.alloca !rec_S_2, !cir.ptr<!rec_S_2>, [""] {alignment = 4 : i64}
// CIR: %[[#V1:]] = cir.cast(bitcast, %[[#V0]] : !cir.ptr<!rec_S_2>), !cir.ptr<!u64i>
// CIR: cir.store{{.*}} %arg0, %[[#V1]] : !u64i, !cir.ptr<!u64i>
Expand Down
Loading
Loading