Skip to content
Draft
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
4 changes: 0 additions & 4 deletions clang/include/clang/CIR/Dialect/IR/CIRAttrs.td
Original file line number Diff line number Diff line change
Expand Up @@ -1192,10 +1192,6 @@ def CIR_OptNoneAttr : CIR_UnitAttr<"OptNone", "optnone"> {
let storageType = [{ OptNoneAttr }];
}

def CIR_NoThrowAttr : CIR_UnitAttr<"NoThrow", "nothrow"> {
let storageType = [{ NoThrowAttr }];
}

def CIR_ConvergentAttr : CIR_UnitAttr<"Convergent", "convergent"> {
let storageType = [{ ConvergentAttr }];
}
Expand Down
1 change: 1 addition & 0 deletions clang/include/clang/CIR/Dialect/IR/CIROps.td
Original file line number Diff line number Diff line change
Expand Up @@ -4105,6 +4105,7 @@ def FuncOp : CIR_Op<"func", [
UnitAttr:$lambda,
UnitAttr:$no_proto,
UnitAttr:$dso_local,
UnitAttr:$nothrow,
DefaultValuedAttr<
CIR_GlobalLinkageKind, "GlobalLinkageKind::ExternalLinkage"
>:$linkage,
Expand Down
34 changes: 19 additions & 15 deletions clang/lib/CIR/CodeGen/CIRGenCall.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -162,8 +162,7 @@ static void AddAttributesFromFunctionProtoType(CIRGenBuilderTy &builder,

if (!isUnresolvedExceptionSpec(FPT->getExceptionSpecType()) &&
FPT->isNothrow()) {
auto nu = cir::NoThrowAttr::get(builder.getContext());
FuncAttrs.set(nu.getMnemonic(), nu);
FuncAttrs.set("nothrow", builder.getUnitAttr());
}
}

Expand Down Expand Up @@ -221,8 +220,8 @@ void CIRGenModule::constructAttributeList(
if (TargetDecl) {

if (TargetDecl->hasAttr<NoThrowAttr>()) {
auto nu = cir::NoThrowAttr::get(&getMLIRContext());
funcAttrs.set(nu.getMnemonic(), nu);
auto nu = mlir::UnitAttr::get(&getMLIRContext());
funcAttrs.set("nothrow", nu);
}

if (const FunctionDecl *Fn = dyn_cast<FunctionDecl>(TargetDecl)) {
Expand Down Expand Up @@ -324,7 +323,7 @@ emitCallLikeOp(CIRGenFunction &CGF, mlir::Location callLoc,
cir::FuncOp directFuncOp,
SmallVectorImpl<mlir::Value> &CIRCallArgs, bool isInvoke,
cir::CallingConv callingConv, cir::SideEffect sideEffect,
cir::ExtraFuncAttributesAttr extraFnAttrs) {
cir::ExtraFuncAttributesAttr extraFnAttrs, bool cannotThrow) {
auto &builder = CGF.getBuilder();
auto getOrCreateSurroundingTryOp = [&]() {
// In OG, we build the landing pad for this scope. In CIR, we emit a
Expand Down Expand Up @@ -383,6 +382,8 @@ emitCallLikeOp(CIRGenFunction &CGF, mlir::Location callLoc,
callLoc, directFuncOp, CIRCallArgs, callingConv, sideEffect);
}
callOpWithExceptions->setAttr("extra_attrs", extraFnAttrs);
if (cannotThrow)
callOpWithExceptions->setAttr("nothrow", builder.getUnitAttr());
CGF.mayThrow = true;

CGF.callWithExceptionCtx = callOpWithExceptions;
Expand All @@ -398,15 +399,20 @@ emitCallLikeOp(CIRGenFunction &CGF, mlir::Location callLoc,
}

assert(builder.getInsertionBlock() && "expected valid basic block");
cir::CIRCallOpInterface callOp;
if (indirectFuncTy) {
// TODO(cir): Set calling convention for indirect calls.
assert(callingConv == cir::CallingConv::C && "NYI");
return builder.createIndirectCallOp(
callOp = builder.createIndirectCallOp(
callLoc, indirectFuncVal, indirectFuncTy, CIRCallArgs,
cir::CallingConv::C, sideEffect, extraFnAttrs);
} else {
callOp = builder.createCallOp(callLoc, directFuncOp, CIRCallArgs, callingConv,
sideEffect, extraFnAttrs);
}
return builder.createCallOp(callLoc, directFuncOp, CIRCallArgs, callingConv,
sideEffect, extraFnAttrs);
if (cannotThrow)
callOp->setAttr("nothrow", builder.getUnitAttr());
return callOp;
}

static RValue getRValueThroughMemory(mlir::Location loc,
Expand Down Expand Up @@ -601,12 +607,10 @@ RValue CIRGenFunction::emitCall(const CIRGenFunctionInfo &CallInfo,
CannotThrow = true;
} else {
// Otherwise, nounwind call sites will never throw.
auto noThrowAttr = cir::NoThrowAttr::get(&getMLIRContext());
CannotThrow = Attrs.getNamed(noThrowAttr.getMnemonic()).has_value();
CannotThrow = Attrs.getNamed("nothrow").has_value();

if (auto fptr = dyn_cast<cir::FuncOp>(CalleePtr))
if (fptr.getExtraAttrs().getElements().contains(
noThrowAttr.getMnemonic()))
if (fptr.getNothrow())
CannotThrow = true;
}
bool isInvoke = CannotThrow ? false : isInvokeDest();
Expand Down Expand Up @@ -650,7 +654,7 @@ RValue CIRGenFunction::emitCall(const CIRGenFunctionInfo &CallInfo,

cir::CIRCallOpInterface callLikeOp = emitCallLikeOp(
*this, callLoc, indirectFuncTy, indirectFuncVal, directFuncOp,
CIRCallArgs, isInvoke, callingConv, sideEffect, extraFnAttrs);
CIRCallArgs, isInvoke, callingConv, sideEffect, extraFnAttrs, CannotThrow);

if (E)
callLikeOp->setAttr("ast",
Expand Down Expand Up @@ -1462,8 +1466,8 @@ static void getTrivialDefaultFunctionAttributes(
llvm_unreachable("NYI");
if (langOpts.OpenCL ||
((langOpts.CUDA || langOpts.HIP) && langOpts.CUDAIsDevice)) {
auto noThrow = cir::NoThrowAttr::get(CGM.getBuilder().getContext());
funcAttrs.set(noThrow.getMnemonic(), noThrow);
auto noThrow = mlir::UnitAttr::get(CGM.getBuilder().getContext());
funcAttrs.set("nothrow", noThrow);
}
}

Expand Down
6 changes: 1 addition & 5 deletions clang/lib/CIR/CodeGen/CIRGenFunction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -683,11 +683,7 @@ static void tryMarkNoThrow(CIRGenFunction &cgf, cir::FuncOp fn) {
if (isInterposable(fn) || cgf.mayThrow)
return;

mlir::NamedAttrList extraAttrs{fn.getExtraAttrs().getElements().getValue()};
auto noThrowAttr = cir::NoThrowAttr::get(&cgf.getMLIRContext());
extraAttrs.set(noThrowAttr.getMnemonic(), noThrowAttr);
fn.setExtraAttrsAttr(cir::ExtraFuncAttributesAttr::get(
extraAttrs.getDictionary(&cgf.getMLIRContext())));
fn.setNothrow(true);
}

cir::FuncOp CIRGenFunction::generateCode(clang::GlobalDecl gd, cir::FuncOp fn,
Expand Down
18 changes: 16 additions & 2 deletions clang/lib/CIR/CodeGen/CIRGenModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2873,8 +2873,7 @@ void CIRGenModule::setCIRFunctionAttributesForDefinition(const Decl *decl,
llvm_unreachable("NYI");

if (!hasUnwindExceptions(getLangOpts())) {
auto attr = cir::NoThrowAttr::get(&getMLIRContext());
attrs.set(attr.getMnemonic(), attr);
f.setNothrow(true);
}

assert(!MissingFeatures::stackProtector());
Expand Down Expand Up @@ -3052,6 +3051,21 @@ void CIRGenModule::setCIRFunctionAttributes(GlobalDecl gd,
func.setExtraAttrsAttr(
cir::ExtraFuncAttributesAttr::get(pal.getDictionary(&getMLIRContext())));

// Set nothrow as a direct attribute if the function declaration has it or
// if the function type is nothrow.
const Decl *TargetDecl = gd.getDecl();
if (TargetDecl && TargetDecl->hasAttr<NoThrowAttr>()) {
func.setNothrow(true);
} else if (const FunctionDecl *Fn = dyn_cast<FunctionDecl>(TargetDecl)) {
if (const FunctionProtoType *FPT =
Fn->getType()->getAs<FunctionProtoType>()) {
if (!isUnresolvedExceptionSpec(FPT->getExceptionSpecType()) &&
FPT->isNothrow()) {
func.setNothrow(true);
}
}
}

// TODO(cir): Check X86_VectorCall incompatibility with WinARM64EC

func.setCallingConv(callingConv);
Expand Down
8 changes: 7 additions & 1 deletion clang/lib/CIR/Dialect/IR/CIRDialect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2641,6 +2641,7 @@ ParseResult cir::FuncOp::parse(OpAsmParser &parser, OperationState &state) {
auto noProtoNameAttr = getNoProtoAttrName(state.name);
auto visibilityNameAttr = getGlobalVisibilityAttrName(state.name);
auto dsoLocalNameAttr = getDsoLocalAttrName(state.name);
auto nothrowNameAttr = getNothrowAttrName(state.name);
auto annotationsNameAttr = getAnnotationsAttrName(state.name);
auto cxxSpecialMemberAttr = getCxxSpecialMemberAttrName(state.name);
if (::mlir::succeeded(parser.parseOptionalKeyword(builtinNameAttr.strref())))
Expand Down Expand Up @@ -2676,6 +2677,8 @@ ParseResult cir::FuncOp::parse(OpAsmParser &parser, OperationState &state) {

if (parser.parseOptionalKeyword(dsoLocalNameAttr).succeeded())
state.addAttribute(dsoLocalNameAttr, parser.getBuilder().getUnitAttr());
if (parser.parseOptionalKeyword(nothrowNameAttr).succeeded())
state.addAttribute(nothrowNameAttr, parser.getBuilder().getUnitAttr());

StringAttr nameAttr;
llvm::SmallVector<OpAsmParser::Argument, 8> arguments;
Expand Down Expand Up @@ -2907,6 +2910,9 @@ void cir::FuncOp::print(OpAsmPrinter &p) {
if (getDsoLocal())
p << " dso_local";

if (getNothrow())
p << " nothrow";

// Print function name, signature, and control.
p << ' ';
p.printSymbolName(getSymName());
Expand All @@ -2932,7 +2938,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(), getNothrowAttrName(), getExtraAttrsAttrName(),
getFunctionTypeAttrName(), getGlobalCtorPriorityAttrName(),
getGlobalDtorPriorityAttrName(), getLambdaAttrName(),
getLinkageAttrName(), getCallingConvAttrName(), getNoProtoAttrName(),
Expand Down
4 changes: 4 additions & 0 deletions clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2493,6 +2493,10 @@ mlir::LogicalResult CIRToLLVMFuncOpLowering::matchAndRewrite(
llvmFnTy, linkage, isDsoLocal, cconv,
mlir::SymbolRefAttr(), attributes);

if (op.getNothrow()) {
fn.setNoUnwind(true);
}

// Lower CIR attributes for arguments.
for (unsigned index = 0; index < fnType.getNumInputs(); index++) {
mlir::DictionaryAttr cirAttrs = op.getArgAttrDict(index);
Expand Down
2 changes: 0 additions & 2 deletions clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVMIR.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,6 @@ class CIRDialectLLVMIRTranslationInterface
llvm_unreachable("Unknown inline kind");
} else if (mlir::dyn_cast<cir::OptNoneAttr>(attr.getValue())) {
llvmFunc->addFnAttr(llvm::Attribute::OptimizeNone);
} else if (mlir::dyn_cast<cir::NoThrowAttr>(attr.getValue())) {
llvmFunc->addFnAttr(llvm::Attribute::NoUnwind);
} else if (mlir::dyn_cast<cir::ConvergentAttr>(attr.getValue())) {
llvmFunc->addFnAttr(llvm::Attribute::Convergent);
} else if (mlir::isa<cir::HotAttr>(attr.getValue())) {
Expand Down
6 changes: 2 additions & 4 deletions clang/test/CIR/CodeGen/OpenCL/nothrow.cl
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,16 @@

// CIR-LABEL: #fn_attr =
// CIR: cl.kernel = #cir.cl.kernel
// CIR: nothrow = #cir.nothrow

// CIR-LABEL: #fn_attr1 =
// CIR-NOT: cl.kernel = #cir.cl.kernel
// CIR: nothrow = #cir.nothrow

kernel void ker() {};
// CIR: cir.func @ker{{.*}} extra(#fn_attr) {
// CIR: cir.func nothrow @ker{{.*}} extra(#fn_attr) {
// LLVM: define{{.*}}@ker(){{.*}} #0

void foo() {};
// CIR: cir.func @foo{{.*}} extra(#fn_attr1) {
// CIR: cir.func nothrow @foo{{.*}} extra(#fn_attr1) {
// LLVM: define{{.*}}@foo(){{.*}} #1

// LLVM-LABEL: attributes #0
Expand Down
4 changes: 1 addition & 3 deletions clang/test/CIR/CodeGen/call-extra-attrs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,10 @@ int s2(int a, int b) {
return s1(a, b);
}

// CIR: #fn_attr = #cir<extra({inline = #cir.inline<no>, nothrow = #cir.nothrow, optnone = #cir.optnone})>
// CIR: #fn_attr1 = #cir<extra({nothrow = #cir.nothrow})>
// CIR: #fn_attr = #cir<extra({inline = #cir.inline<no>, optnone = #cir.optnone})>

// CIR: cir.func {{.*}} @_Z2s0ii(%{{.*}}, %{{.*}}) -> {{.*}} extra(#fn_attr)
// CIR: cir.func {{.*}} @_Z2s1ii(%{{.*}}, %{{.*}}) -> {{.*}} extra(#fn_attr)
// CIR: cir.call @_Z2s0ii(%{{.*}}, %{{.*}}) : ({{.*}}, {{.*}}) -> {{.*}} extra(#fn_attr1)
// CIR: cir.func {{.*}} @_Z2s2ii(%{{.*}}, %{{.*}}) -> {{.*}} extra(#fn_attr)
// CHECK-NOT: cir.call @_Z2s1ii(%{{.*}}, %{{.*}}) : ({{.*}}, {{.*}}) -> {{.*}} extra(#fn_attr{{.*}})

Expand Down
1 change: 0 additions & 1 deletion clang/test/CIR/CodeGen/conditional-cleanup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,6 @@ namespace test7 {
// CIR: }

// CIR_EH-DAG: #[[$ATTR_0:.+]] = #cir.bool<false> : !cir.bool
// CIR_EH-DAG: #[[$ATTR_1:.+]] = #cir<extra({nothrow = #cir.nothrow})>
// CIR_EH-DAG: #[[$ATTR_2:.+]] = #cir<extra({inline = #cir.inline<no>, optnone = #cir.optnone})>
// CIR_EH-DAG: #[[$ATTR_3:.+]] = #cir.bool<true> : !cir.bool

Expand Down
18 changes: 9 additions & 9 deletions clang/test/CIR/CodeGen/coro-task.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ co_invoke_fn co_invoke;

// CHECK: cir.func builtin private @__builtin_coro_id(!u32i, !cir.ptr<!void>, !cir.ptr<!void>, !cir.ptr<!void>) -> !u32i
// CHECK: cir.func builtin private @__builtin_coro_alloc(!u32i) -> !cir.bool
// CHECK: cir.func builtin private @__builtin_coro_size() -> !u64i
// CHECK: cir.func builtin private nothrow @__builtin_coro_size() -> !u64i
// CHECK: cir.func builtin private @__builtin_coro_begin(!u32i, !cir.ptr<!void>) -> !cir.ptr<!void>

using VoidTask = folly::coro::Task<void>;
Expand All @@ -148,7 +148,7 @@ VoidTask silly_task() {
co_await std::suspend_always();
}

// CHECK: cir.func coroutine dso_local @_Z10silly_taskv() -> ![[VoidTask]] extra{{.*}}{
// CHECK: cir.func coroutine dso_local nothrow @_Z10silly_taskv() -> ![[VoidTask]]

// Allocate promise.

Expand Down Expand Up @@ -274,7 +274,7 @@ folly::coro::Task<int> byRef(const std::string& s) {
}

// FIXME: this could be less redundant than two allocas + reloads
// CHECK: cir.func coroutine dso_local @_Z5byRefRKSt6string(%arg0: !cir.ptr<![[StdString]]> {{.*}} ![[IntTask]] extra{{.*}}{
// CHECK: cir.func coroutine {{.*}} @_Z5byRefRKSt6string(%arg0: !cir.ptr<![[StdString]]> {{.*}} ![[IntTask]]
// CHECK: %[[#AllocaParam:]] = cir.alloca !cir.ptr<![[StdString]]>, {{.*}} ["s", init, const]
// CHECK: %[[#AllocaFnUse:]] = cir.alloca !cir.ptr<![[StdString]]>, {{.*}} ["s", init, const]

Expand All @@ -291,7 +291,7 @@ folly::coro::Task<void> silly_coro() {
// Make sure we properly handle OnFallthrough coro body sub stmt and
// check there are not multiple co_returns emitted.

// CHECK: cir.func coroutine dso_local @_Z10silly_corov() {{.*}} ![[VoidTask]] extra{{.*}}{
// CHECK: cir.func coroutine {{.*}} @_Z10silly_corov() {{.*}} ![[VoidTask]]
// CHECK: cir.await(init, ready : {
// CHECK: cir.call @_ZN5folly4coro4TaskIvE12promise_type11return_voidEv
// CHECK-NOT: cir.call @_ZN5folly4coro4TaskIvE12promise_type11return_voidEv
Expand All @@ -303,7 +303,7 @@ folly::coro::Task<int> go1() {
co_return co_await task;
}

// CHECK: cir.func coroutine dso_local @_Z3go1v() {{.*}} ![[IntTask]] extra{{.*}}{
// CHECK: cir.func coroutine {{.*}} @_Z3go1v() {{.*}} ![[IntTask]]
// CHECK: %[[#IntTaskAddr:]] = cir.alloca ![[IntTask]], !cir.ptr<![[IntTask]]>, ["task", init]

// CHECK: cir.await(init, ready : {
Expand Down Expand Up @@ -338,16 +338,16 @@ folly::coro::Task<int> go1_lambda() {
co_return co_await task;
}

// CHECK: cir.func coroutine lambda internal private dso_local @_ZZ10go1_lambdavENK3$_0clEv{{.*}} ![[IntTask]] extra{{.*}}{
// CHECK: cir.func coroutine dso_local @_Z10go1_lambdav() {{.*}} ![[IntTask]] extra{{.*}}{
// CHECK: cir.func coroutine lambda {{.*}} @_ZZ10go1_lambdavENK3$_0clEv{{.*}} ![[IntTask]]
// CHECK: cir.func coroutine {{.*}} @_Z10go1_lambdav() {{.*}} ![[IntTask]]

folly::coro::Task<int> go4() {
auto* fn = +[](int const& i) -> folly::coro::Task<int> { co_return i; };
auto task = fn(3);
co_return co_await std::move(task);
}

// CHECK: cir.func coroutine dso_local @_Z3go4v() {{.*}} ![[IntTask]] extra{{.*}}{
// CHECK: cir.func coroutine {{.*}} @_Z3go4v() {{.*}} ![[IntTask]]

// CHECK: cir.await(init, ready : {
// CHECK: }, suspend : {
Expand Down Expand Up @@ -387,7 +387,7 @@ folly::coro::Task<void> yield1() {
co_yield t;
}

// CHECK: cir.func coroutine dso_local @_Z6yield1v() -> !rec_folly3A3Acoro3A3ATask3Cvoid3E
// CHECK: cir.func coroutine {{.*}} @_Z6yield1v() -> !rec_folly3A3Acoro3A3ATask3Cvoid3E

// CHECK: cir.await(init, ready : {
// CHECK: }, suspend : {
Expand Down
4 changes: 2 additions & 2 deletions clang/test/CIR/CodeGen/default-methods.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ struct S {
} t;
};

// CIR-LABEL: cir.func linkonce_odr @_ZN1S1TaSERKS0_({{.*}} {
// CIR-LABEL: cir.func linkonce_odr @_ZN1SaSERKS_(
// CIR-LABEL: cir.func linkonce_odr nothrow @_ZN1S1TaSERKS0_({{.*}} {
// CIR-LABEL: cir.func linkonce_odr nothrow @_ZN1SaSERKS_(
// CIR: cir.call @_ZN1S1TaSERKS0_(
// CIR-LABEL: cir.func {{.*}} @_Z1fR1SS0_(
// CIR: cir.call @_ZN1SaSERKS_(
Expand Down
6 changes: 3 additions & 3 deletions clang/test/CIR/CodeGen/dynamic-cast.mlir
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ module @"/Users/henrichlauko/src/clangir/clang/test/CIR/CodeGen/dynamic-cast.cpp
cir.global constant external @_ZTI7Derived = #cir.typeinfo<{#cir.global_view<@_ZTVN10__cxxabiv120__si_class_type_infoE, [2 : i32]> : !cir.ptr<!u8i>, #cir.global_view<@_ZTS7Derived> : !cir.ptr<!u8i>, #cir.global_view<@_ZTI4Base> : !cir.ptr<!u8i>}> : !rec_anon_struct {alignment = 8 : i64} loc(#loc28)
cir.func private @__dynamic_cast(!cir.ptr<!void>, !cir.ptr<!u8i>, !cir.ptr<!u8i>, !s64i) -> !cir.ptr<!void> loc(#loc)
cir.func private @__cxa_bad_cast() loc(#loc)
cir.func dso_local @_Z8ptr_castP4Base(%arg0: !cir.ptr<!rec_Base> loc(fused[#loc5, #loc6])) -> !cir.ptr<!rec_Derived> {inline = #cir.inline<no>, nothrow = #cir.nothrow, optnone = #cir.optnone} {
cir.func dso_local nothrow @_Z8ptr_castP4Base(%arg0: !cir.ptr<!rec_Base> loc(fused[#loc5, #loc6])) -> !cir.ptr<!rec_Derived> {inline = #cir.inline<no>, optnone = #cir.optnone} {
%0 = cir.alloca !cir.ptr<!rec_Base>, !cir.ptr<!cir.ptr<!rec_Base>>, ["b", init] {alignment = 8 : i64} loc(#loc30)
%1 = cir.alloca !cir.ptr<!rec_Derived>, !cir.ptr<!cir.ptr<!rec_Derived>>, ["__retval"] {alignment = 8 : i64} loc(#loc4)
cir.store %arg0, %0 : !cir.ptr<!rec_Base>, !cir.ptr<!cir.ptr<!rec_Base>> loc(#loc7)
Expand All @@ -43,7 +43,7 @@ module @"/Users/henrichlauko/src/clangir/clang/test/CIR/CodeGen/dynamic-cast.cpp
%5 = cir.load %1 : !cir.ptr<!cir.ptr<!rec_Derived>>, !cir.ptr<!rec_Derived> loc(#loc31)
cir.return %5 : !cir.ptr<!rec_Derived> loc(#loc31)
} loc(#loc29)
cir.func dso_local @_Z8ref_castR4Base(%arg0: !cir.ptr<!rec_Base> loc(fused[#loc12, #loc13])) -> !cir.ptr<!rec_Derived> {inline = #cir.inline<no>, nothrow = #cir.nothrow, optnone = #cir.optnone} {
cir.func {{.*}} @_Z8ref_castR4Base(%arg0: !cir.ptr<!rec_Base> loc(fused[#loc12, #loc13])) -> !cir.ptr<!rec_Derived> {inline = #cir.inline<no>, optnone = #cir.optnone} {
%0 = cir.alloca !cir.ptr<!rec_Base>, !cir.ptr<!cir.ptr<!rec_Base>>, ["b", init, const] {alignment = 8 : i64} loc(#loc33)
%1 = cir.alloca !cir.ptr<!rec_Derived>, !cir.ptr<!cir.ptr<!rec_Derived>>, ["__retval"] {alignment = 8 : i64} loc(#loc11)
cir.store %arg0, %0 : !cir.ptr<!rec_Base>, !cir.ptr<!cir.ptr<!rec_Base>> loc(#loc14)
Expand All @@ -64,7 +64,7 @@ module @"/Users/henrichlauko/src/clangir/clang/test/CIR/CodeGen/dynamic-cast.cpp
%11 = cir.load %1 : !cir.ptr<!cir.ptr<!rec_Derived>>, !cir.ptr<!rec_Derived> loc(#loc35)
cir.return %11 : !cir.ptr<!rec_Derived> loc(#loc35)
} loc(#loc32)
cir.func dso_local @_Z20ptr_cast_to_completeP4Base(%arg0: !cir.ptr<!rec_Base> loc(fused[#loc21, #loc22])) -> !cir.ptr<!void> {inline = #cir.inline<no>, nothrow = #cir.nothrow, optnone = #cir.optnone} {
cir.func {{.*}} @_Z20ptr_cast_to_completeP4Base(%arg0: !cir.ptr<!rec_Base> loc(fused[#loc21, #loc22])) -> !cir.ptr<!void> {inline = #cir.inline<no>, optnone = #cir.optnone} {
%0 = cir.alloca !cir.ptr<!rec_Base>, !cir.ptr<!cir.ptr<!rec_Base>>, ["ptr", init] {alignment = 8 : i64} loc(#loc37)
%1 = cir.alloca !cir.ptr<!void>, !cir.ptr<!cir.ptr<!void>>, ["__retval"] {alignment = 8 : i64} loc(#loc20)
cir.store %arg0, %0 : !cir.ptr<!rec_Base>, !cir.ptr<!cir.ptr<!rec_Base>> loc(#loc23)
Expand Down
12 changes: 6 additions & 6 deletions clang/test/CIR/CodeGen/function-attrs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@ int s3(int a, int b) {
return x;
}

// CIR: #fn_attr = #cir<extra({inline = #cir.inline<hint>, nothrow = #cir.nothrow})>
// CIR: #fn_attr1 = #cir<extra({inline = #cir.inline<no>, nothrow = #cir.nothrow})>
// CIR: #fn_attr2 = #cir<extra({inline = #cir.inline<always>, nothrow = #cir.nothrow})>
// CIR: #fn_attr = #cir<extra({inline = #cir.inline<hint>})>
// CIR: #fn_attr1 = #cir<extra({inline = #cir.inline<no>})>
// CIR: #fn_attr2 = #cir<extra({inline = #cir.inline<always>})>

// CIR: cir.func linkonce_odr @_Z2s0ii(%arg0:{{.*}}, %arg1:{{.*}} -> {{.*}} extra(#fn_attr)
// CIR: cir.func {{.*}} @_Z2s1ii(%arg0:{{.*}}, %arg1:{{.*}} -> {{.*}} extra(#fn_attr1)
// CIR: cir.func {{.*}} @_Z2s2ii(%arg0:{{.*}}, %arg1:{{.*}} -> {{.*}} extra(#fn_attr2)
// CIR: cir.func linkonce_odr nothrow @_Z2s0ii(%arg0:{{.*}}, %arg1:{{.*}} -> {{.*}} extra(#fn_attr)
// CIR: cir.func {{.*}} nothrow @_Z2s1ii(%arg0:{{.*}}, %arg1:{{.*}} -> {{.*}} extra(#fn_attr1)
// CIR: cir.func {{.*}} nothrow @_Z2s2ii(%arg0:{{.*}}, %arg1:{{.*}} -> {{.*}} extra(#fn_attr2)
// CIR: cir.func {{.*}} @_Z2s3ii(%arg0:{{.*}}, %arg1:{{.*}} -> {{.*}} {

// LLVM: define dso_local i32 @_Z2s1ii(i32 %0, i32 %1) {{.*}} #[[#ATTR1:]]
Expand Down
Loading
Loading