Author: Chuanqi Xu Date: 2023-06-26T14:37:25+08:00 New Revision: 21765af763f163e6c87f63d3c1dbc32b06119f60
URL: https://github.com/llvm/llvm-project/commit/21765af763f163e6c87f63d3c1dbc32b06119f60 DIFF: https://github.com/llvm/llvm-project/commit/21765af763f163e6c87f63d3c1dbc32b06119f60.diff LOG: [C++] [Coroutines] Assume the allocation doesn't return nullptr In case of 'get_return_object_on_allocation_failure' get declared, the compiler is required to call 'operator new(size_t, nothrow_t)' and the handle the failure case by calling 'get_return_object_on_allocation_failure()'. But the failure case should be rare and we can assume the allocation is successful and pass the information to the optimizer. Added: Modified: clang/lib/CodeGen/CGCoroutine.cpp clang/test/CodeGenCoroutines/coro-alloc.cpp Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CGCoroutine.cpp b/clang/lib/CodeGen/CGCoroutine.cpp index da3da5e600104..8437cda79beb2 100644 --- a/clang/lib/CodeGen/CGCoroutine.cpp +++ b/clang/lib/CodeGen/CGCoroutine.cpp @@ -630,6 +630,8 @@ void CodeGenFunction::EmitCoroutineBody(const CoroutineBodyStmt &S) { // See if allocation was successful. auto *NullPtr = llvm::ConstantPointerNull::get(Int8PtrTy); auto *Cond = Builder.CreateICmpNE(AllocateCall, NullPtr); + // Expect the allocation to be successful. + emitCondLikelihoodViaExpectIntrinsic(Cond, Stmt::LH_Likely); Builder.CreateCondBr(Cond, InitBB, RetOnFailureBB); // If not, return OnAllocFailure object. diff --git a/clang/test/CodeGenCoroutines/coro-alloc.cpp b/clang/test/CodeGenCoroutines/coro-alloc.cpp index 05b3d56483d0e..d026a0d7df227 100644 --- a/clang/test/CodeGenCoroutines/coro-alloc.cpp +++ b/clang/test/CodeGenCoroutines/coro-alloc.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 \ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 -O2 \ // RUN: -Wno-coroutine-missing-unhandled-exception -emit-llvm %s -o - -disable-llvm-passes \ // RUN: | FileCheck %s @@ -228,6 +228,7 @@ extern "C" int f4(promise_on_alloc_failure_tag) { // CHECK: %[[SIZE:.+]] = call i64 @llvm.coro.size.i64() // CHECK: %[[MEM:.+]] = call noalias noundef ptr @_ZnwmRKSt9nothrow_t(i64 noundef %[[SIZE]], ptr noundef nonnull align 1 dereferenceable(1) @_ZStL7nothrow) // CHECK: %[[OK:.+]] = icmp ne ptr %[[MEM]], null + // CHECK: call i1 @llvm.expect.i1(i1 %[[OK]], i1 true) // CHECK: br i1 %[[OK]], label %[[OKBB:.+]], label %[[ERRBB:.+]] // CHECK: [[ERRBB]]: _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits