Skip to content

Commit 7164544

Browse files
authored
[CIR] Upstream Try block with only noexcept calls (#165153)
Upstream try block with only noexcept calls inside, which doesn't need to be converted to TryCallOp Issue #154992
1 parent 0b1ef8c commit 7164544

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

clang/lib/CIR/Dialect/Transforms/FlattenCFG.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -606,10 +606,12 @@ class CIRTryOpFlattening : public mlir::OpRewritePattern<cir::TryOp> {
606606
// `cir.try_call`.
607607
llvm::SmallVector<cir::CallOp, 4> callsToRewrite;
608608
tryOp.getTryRegion().walk([&](CallOp op) {
609+
if (op.getNothrow())
610+
return;
611+
609612
// Only grab calls within immediate closest TryOp scope.
610613
if (op->getParentOfType<cir::TryOp>() != tryOp)
611614
return;
612-
assert(!cir::MissingFeatures::opCallExceptionAttr());
613615
callsToRewrite.push_back(op);
614616
});
615617

clang/test/CIR/CodeGen/try-catch.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,3 +164,33 @@ void try_catch_with_alloca() {
164164
// OGCG: %[[TMP_B:.*]] = load i32, ptr %[[B_ADDR]], align 4
165165
// OGCG: %[[RESULT:.*]] = add nsw i32 %[[TMP_A]], %[[TMP_B]]
166166
// OGCG: store i32 %[[RESULT]], ptr %[[C_ADDR]], align 4
167+
168+
void function_with_noexcept() noexcept;
169+
170+
void calling_noexcept_function_inside_try_block() {
171+
try {
172+
function_with_noexcept();
173+
} catch (...) {
174+
}
175+
}
176+
177+
// CIR: cir.scope {
178+
// CIR: cir.try {
179+
// CIR: cir.call @_Z22function_with_noexceptv() nothrow : () -> ()
180+
// CIR: cir.yield
181+
// CIR: }
182+
// CIR: }
183+
184+
// LLVM: br label %[[LABEL_1:.*]]
185+
// LLVM: [[LABEL_1]]:
186+
// LLVM: br label %[[LABEL_2:.*]]
187+
// LLVM: [[LABEL_2]]:
188+
// LLVM: call void @_Z22function_with_noexceptv()
189+
// LLVM: br label %[[LABEL_3:.*]]
190+
// LLVM: [[LABEL_3]]:
191+
// LLVM: br label %[[LABEL_4:.*]]
192+
// LLVM: [[LABEL_4]]:
193+
// LLVM: ret void
194+
195+
// OGCG: call void @_Z22function_with_noexceptv()
196+
// OGCG: ret void

0 commit comments

Comments
 (0)