https://github.com/RiverDave updated https://github.com/llvm/llvm-project/pull/221818
>From c5949de4c9ceac369f65e4df14ec4bc434b2be54 Mon Sep 17 00:00:00 2001 From: David Rivera <[email protected]> Date: Fri, 25 Sep 2026 09:39:06 -0400 Subject: [PATCH] [CIR] Match OGCG noalias and memory effects on operator new Sane replaceable operator new calls get return noalias, and new-expressions also get memory(inaccessiblemem: readwrite, errnomem: write), matching classic codegen. -fno-assume-sane-operator-new drops both. Co-authored-by: Cursor <[email protected]> --- clang/lib/CIR/CodeGen/CIRGenCall.cpp | 12 ++- clang/lib/CIR/CodeGen/CIRGenExprCXX.cpp | 19 +++- clang/test/CIR/CodeGen/class.cpp | 4 +- .../CIR/CodeGen/new-delete-deactivation.cpp | 22 ++--- clang/test/CIR/CodeGen/new-delete.cpp | 16 ++-- clang/test/CIR/CodeGen/new.cpp | 88 +++++++++---------- .../test/CIR/CodeGen/operator-new-noalias.cpp | 24 +++++ .../test/CIR/CodeGen/paren-list-agg-init.cpp | 6 +- .../CodeGenBuiltins/builtin-new-delete.cpp | 10 +-- clang/test/CIR/CodeGenCXX/new-array-init.cpp | 38 ++++---- .../test/CIR/CodeGenCoroutines/coro-task.cpp | 2 +- 11 files changed, 142 insertions(+), 99 deletions(-) create mode 100644 clang/test/CIR/CodeGen/operator-new-noalias.cpp diff --git a/clang/lib/CIR/CodeGen/CIRGenCall.cpp b/clang/lib/CIR/CodeGen/CIRGenCall.cpp index 226bc0a0ed0d5a..297d660680886e 100644 --- a/clang/lib/CIR/CodeGen/CIRGenCall.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenCall.cpp @@ -374,8 +374,16 @@ void CIRGenModule::constructAttributeList( addAttributesFromFunctionProtoType( getBuilder(), attrs, func->getType()->getAs<FunctionProtoType>()); - // TODO(cir): When doing 'return attrs' we need to cover the 'NoAlias' for - // global allocation functions here. + // A sane operator new returns a non-aliasing pointer. Classic applies + // this only at call sites. The inaccessible-or-errno memory effect is + // set on the new-expression call in emitNewDeleteCall. + if (attrOnCallSite && func->isReplaceableGlobalAllocationFunction() && + codeGenOpts.AssumeSaneOperatorNew && + func->getDeclName().isAnyOperatorNew()) { + retAttrs.set(mlir::LLVM::LLVMDialect::getNoAliasAttrName(), + mlir::UnitAttr::get(&getMLIRContext())); + } + assert(!cir::MissingFeatures::opCallAttrs()); const CXXMethodDecl *md = dyn_cast<CXXMethodDecl>(func); diff --git a/clang/lib/CIR/CodeGen/CIRGenExprCXX.cpp b/clang/lib/CIR/CodeGen/CIRGenExprCXX.cpp index 57c61c2f47ed24..7317411bc8bde8 100644 --- a/clang/lib/CIR/CodeGen/CIRGenExprCXX.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenExprCXX.cpp @@ -765,10 +765,21 @@ static RValue emitNewDeleteCall(CIRGenFunction &cgf, /// to a replaceable global allocation function. /// /// We model such elidable calls with the 'builtin' attribute. - if (calleeDecl->isReplaceableGlobalAllocationFunction() && calleePtr && - calleePtr->hasAttr(cir::CIRDialect::getNoBuiltinAttrName())) { - callOrTryCall->setAttr(cir::CIRDialect::getBuiltinAttrName(), - mlir::UnitAttr::get(callOrTryCall->getContext())); + if (calleeDecl->isReplaceableGlobalAllocationFunction() && calleePtr) { + if (calleePtr->hasAttr(cir::CIRDialect::getNoBuiltinAttrName())) + callOrTryCall->setAttr(cir::CIRDialect::getBuiltinAttrName(), + mlir::UnitAttr::get(callOrTryCall->getContext())); + + // A sane operator new does not read or write accessible memory. Classic + // sets this on the new-expression call, not on a direct ::operator new + // call and not on the function definition. inaccessibleMem is readwrite + // and errnoMem is write, matching inaccessibleOrErrnoMemOnly(ModRef, Mod). + if (cgf.cgm.getCodeGenOpts().AssumeSaneOperatorNew && + calleeDecl->getDeclName().isAnyOperatorNew()) + callOrTryCall.setMemoryEffectsAttr( + cir::MemoryEffectsAttr::inaccessibleOrErrnoMemOnly( + callOrTryCall->getContext(), cir::ModRefInfo::ModRef, + cir::ModRefInfo::Mod)); } return rv; diff --git a/clang/test/CIR/CodeGen/class.cpp b/clang/test/CIR/CodeGen/class.cpp index afa5aab3f2d765..9e28bb90512434 100644 --- a/clang/test/CIR/CodeGen/class.cpp +++ b/clang/test/CIR/CodeGen/class.cpp @@ -181,7 +181,7 @@ void fam_3() { // CIR: cir.func{{.*}}@_Z5fam_3v // CIR: %[[A:.*]] = cir.alloca "a" align(8) init : !cir.ptr<!cir.ptr<!rec_JustFam>> // CIR: %[[ZERO:.*]] = cir.const #cir.int<0> : !u64i -// CIR: %[[NEW:.*]] = cir.call @_Znwm(%[[ZERO]]) {allocsize = array<i32: 0>, builtin} +// CIR: %[[NEW:.*]] = cir.call @_Znwm(%[[ZERO]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} // CIR: %[[NEW_TO_A:.*]] = cir.cast bitcast %[[NEW]] : !cir.ptr<!void> -> !cir.ptr<!rec_JustFam> // CIR: cir.store align(8) %[[NEW_TO_A]], %[[A]] : !cir.ptr<!rec_JustFam>, !cir.ptr<!cir.ptr<!rec_JustFam>> // CIR: %[[LOAD_A:.*]] = cir.load align(8) %[[A]] : !cir.ptr<!cir.ptr<!rec_JustFam>>, !cir.ptr<!rec_JustFam> @@ -189,7 +189,7 @@ void fam_3() { // LLVM: define{{.*}}@_Z5fam_3v // LLVM: %[[A:.*]] = alloca ptr, align 8 -// LLVM: %[[NEW:.*]] = call noundef nonnull ptr @_Znwm(i64 noundef 0) +// LLVM: %[[NEW:.*]] = call noalias noundef nonnull ptr @_Znwm(i64 noundef 0) // LLVM: store ptr %[[NEW]], ptr %[[A]], align 8 // LLVM: %[[LOAD_A:.*]] = load ptr, ptr %[[A]], align 8 // LLVM: getelementptr inbounds nuw %struct.JustFam, ptr %[[LOAD_A]], i32 0, i32 0 diff --git a/clang/test/CIR/CodeGen/new-delete-deactivation.cpp b/clang/test/CIR/CodeGen/new-delete-deactivation.cpp index 050dd9abf413ad..0b94fa22750763 100644 --- a/clang/test/CIR/CodeGen/new-delete-deactivation.cpp +++ b/clang/test/CIR/CodeGen/new-delete-deactivation.cpp @@ -26,7 +26,7 @@ A *deact_simple() { return new A(makeB()); } // CIR: %[[NEW_RESULT:.*]] = cir.alloca "__new_result" {{.*}} : !cir.ptr<!cir.ptr<!rec_A>> // CIR: %[[TMP:.*]] = cir.alloca "ref.tmp0" {{.*}} : !cir.ptr<!rec_B> // CIR: %[[ACTIVE:.*]] = cir.alloca "cleanup.isactive" {{.*}} : !cir.ptr<!cir.bool> -// CIR: %[[PTR:.*]] = cir.call @_Znwm({{.*}}) {{{.*}}builtin} +// CIR: %[[PTR:.*]] = cir.call @_Znwm({{.*}}) {{{.*}}builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} // CIR: cir.cleanup.scope { // CIR: %[[TRUE:.*]] = cir.const #true // CIR: cir.store %[[TRUE]], %[[ACTIVE]] : !cir.bool, !cir.ptr<!cir.bool> @@ -49,7 +49,7 @@ A *deact_simple() { return new A(makeB()); } // LLVM-LABEL: define dso_local ptr @_Z12deact_simplev() {{.*}} personality ptr @__gxx_personality_v0 { // LLVM: %[[TMP:.*]] = alloca %struct.B // LLVM: %[[ACTIVE:.*]] = alloca i8 -// LLVM: %[[PTR:.*]] = call nonnull ptr @_Znwm(i64 1) #[[ATTR_BUILTIN_NEW:.*]] +// LLVM: %[[PTR:.*]] = call noalias nonnull ptr @_Znwm(i64 1) #[[ATTR_BUILTIN_NEW:.*]] // LLVM: store i8 1, ptr %[[ACTIVE]] // LLVM: invoke void @_Z5makeBv(ptr dead_on_unwind writable sret(%struct.B) align 4 %[[TMP]]) // LLVM: to label %[[INVOKE_CONT:.*]] unwind label %[[UNWIND_OUTER:.*]] @@ -106,7 +106,7 @@ A *deact_if(bool cond) { // CIR-LABEL: cir.func {{.*}} @_Z8deact_ifb // CIR: cir.if {{.*}} { // CIR: %[[ACTIVE:.*]] = cir.alloca "cleanup.isactive" {{.*}} : !cir.ptr<!cir.bool> -// CIR: %[[PTR:.*]] = cir.call @_Znwm({{.*}}) {{{.*}}builtin} +// CIR: %[[PTR:.*]] = cir.call @_Znwm({{.*}}) {{{.*}}builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} // CIR: cir.cleanup.scope { // CIR: %[[TRUE:.*]] = cir.const #true // CIR: cir.store %[[TRUE]], %[[ACTIVE]] : !cir.bool, !cir.ptr<!cir.bool> @@ -124,7 +124,7 @@ A *deact_if(bool cond) { // LLVM-LABEL: define dso_local ptr @_Z8deact_ifb(i1 zeroext %0) {{.*}} personality ptr @__gxx_personality_v0 { // LLVM: br i1 %{{.*}}, label %[[THEN:.*]], label %[[END:.*]] // LLVM: [[THEN]]: -// LLVM: %[[PTR:.*]] = call nonnull ptr @_Znwm(i64 1) #[[ATTR_BUILTIN_NEW]] +// LLVM: %[[PTR:.*]] = call noalias nonnull ptr @_Znwm(i64 1) #[[ATTR_BUILTIN_NEW]] // LLVM: store i8 1, ptr %[[ACTIVE:.*]] // LLVM: invoke void @_ZN1AC1Ei(ptr {{.*}} %[[PTR]], i32 {{.*}}) // LLVM: to label %[[CONT:.*]] unwind label %[[UNWIND_INNER:.*]] @@ -162,7 +162,7 @@ A *deact_ternary(bool cond) { return (new A(makeB()), cond) ? nullptr : nullptr; // CIR-LABEL: cir.func {{.*}} @_Z13deact_ternaryb // CIR: %[[ACTIVE:.*]] = cir.alloca "cleanup.isactive" {{.*}} : !cir.ptr<!cir.bool> -// CIR: %[[PTR:.*]] = cir.call @_Znwm({{.*}}) {{{.*}}builtin} +// CIR: %[[PTR:.*]] = cir.call @_Znwm({{.*}}) {{{.*}}builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} // CIR: cir.cleanup.scope { // CIR: %[[TRUE:.*]] = cir.const #true // CIR: cir.store %[[TRUE]], %[[ACTIVE]] : !cir.bool, !cir.ptr<!cir.bool> @@ -177,7 +177,7 @@ A *deact_ternary(bool cond) { return (new A(makeB()), cond) ? nullptr : nullptr; // CIR: } // LLVM-LABEL: define dso_local ptr @_Z13deact_ternaryb(i1 zeroext %0) {{.*}} personality ptr @__gxx_personality_v0 { -// LLVM: %[[PTR:.*]] = call nonnull ptr @_Znwm(i64 1) #[[ATTR_BUILTIN_NEW]] +// LLVM: %[[PTR:.*]] = call noalias nonnull ptr @_Znwm(i64 1) #[[ATTR_BUILTIN_NEW]] // LLVM: store i8 1, ptr %[[ACTIVE:.*]] // LLVM: invoke void @_ZN1AC1Ei(ptr {{.*}} %[[PTR]], i32 {{.*}}) // LLVM: to label %[[CONT:.*]] unwind label %[[UNWIND_INNER:.*]] @@ -219,7 +219,7 @@ A *deact_while_cond(int n) { // CIR-LABEL: cir.func {{.*}} @_Z16deact_while_condi // CIR: %[[ACTIVE:.*]] = cir.alloca "cleanup.isactive" {{.*}} : !cir.ptr<!cir.bool> // CIR: cir.while { -// CIR: %[[PTR:.*]] = cir.call @_Znwm({{.*}}) {{{.*}}builtin} +// CIR: %[[PTR:.*]] = cir.call @_Znwm({{.*}}) {{{.*}}builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} // CIR: cir.cleanup.scope { // CIR: %[[TRUE:.*]] = cir.const #true // CIR: cir.store %[[TRUE]], %[[ACTIVE]] : !cir.bool, !cir.ptr<!cir.bool> @@ -240,7 +240,7 @@ A *deact_while_cond(int n) { // LLVM: %[[ACTIVE:.*]] = alloca i8 // LLVM: br label %[[WHILE_COND:.*]] // LLVM: [[WHILE_COND]]: -// LLVM: %[[PTR:.*]] = call nonnull ptr @_Znwm(i64 1) #[[ATTR_BUILTIN_NEW]] +// LLVM: %[[PTR:.*]] = call noalias nonnull ptr @_Znwm(i64 1) #[[ATTR_BUILTIN_NEW]] // LLVM: store i8 1, ptr %[[ACTIVE]] // LLVM: invoke void @_Z5makeBv(ptr dead_on_unwind writable sret(%struct.B) align 4 %[[TMP]]) // LLVM: to label %[[INVOKE_CONT:.*]] unwind label %[[UNWIND_OUTER:.*]] @@ -299,7 +299,7 @@ A *deact_switch(int kind) { // CIR: %[[ACTIVE:.*]] = cir.alloca "cleanup.isactive" {{.*}} : !cir.ptr<!cir.bool> // CIR: cir.switch({{.*}}) { // CIR: cir.case(equal, [#cir.int<1> : !s32i]) { -// CIR: %[[PTR:.*]] = cir.call @_Znwm({{.*}}) {{{.*}}builtin} +// CIR: %[[PTR:.*]] = cir.call @_Znwm({{.*}}) {{{.*}}builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} // CIR: cir.cleanup.scope { // CIR: %[[TRUE:.*]] = cir.const #true // CIR: cir.store %[[TRUE]], %[[ACTIVE]] : !cir.bool, !cir.ptr<!cir.bool> @@ -320,7 +320,7 @@ A *deact_switch(int kind) { // LLVM: i32 1, label %[[CASE1:.*]] // LLVM: ] // LLVM: [[CASE1]]: -// LLVM: %[[PTR:.*]] = call nonnull ptr @_Znwm(i64 1) #[[ATTR_BUILTIN_NEW]] +// LLVM: %[[PTR:.*]] = call noalias nonnull ptr @_Znwm(i64 1) #[[ATTR_BUILTIN_NEW]] // LLVM: store i8 1, ptr %[[ACTIVE:.*]] // LLVM: invoke void @_ZN1AC1Ei(ptr {{.*}} %[[PTR]], i32 {{.*}}) // LLVM: to label %[[CONT:.*]] unwind label %[[UNWIND_INNER:.*]] @@ -358,7 +358,7 @@ A *deact_switch(int kind) { // OGCG: [[DO_DELETE]]: // OGCG: call void @_ZdlPv(ptr %[[PTR]]) -// LLVM-DAG: attributes #[[ATTR_BUILTIN_NEW]] = {{{.*}}builtin{{.*}}} +// LLVM-DAG: attributes #[[ATTR_BUILTIN_NEW]] = {{{.*}}builtin{{.*}}memory(inaccessiblemem: readwrite, errnomem: write){{.*}}} // LLVM-DAG: attributes #[[ATTR_BUILTIN_DEL]] = {{{.*}}builtin{{.*}}} // LLVM-DAG: attributes #[[ATTR_NOUNWIND]] = {{{.*}}nounwind{{.*}}} // OGCG-DAG: attributes #[[OGCG_ATTR_BUILTIN_NEW]] = {{{.*}}builtin{{.*}}} diff --git a/clang/test/CIR/CodeGen/new-delete.cpp b/clang/test/CIR/CodeGen/new-delete.cpp index fb60110925c715..da453049aeaa15 100644 --- a/clang/test/CIR/CodeGen/new-delete.cpp +++ b/clang/test/CIR/CodeGen/new-delete.cpp @@ -16,7 +16,7 @@ A *a() { // CIR: %[[RETVAL:.*]] = cir.alloca "__retval" {{.*}} : !cir.ptr<!cir.ptr<!rec_A>> // CIR: %[[NEW_RESULT:.*]] = cir.alloca "__new_result" {{.*}} : !cir.ptr<!cir.ptr<!rec_A>> // CIR: %[[ALLOC_SIZE:.*]] = cir.const #cir.int<8> : !u64i -// CIR: %[[PTR:.*]] = cir.call @_Znwm(%[[ALLOC_SIZE]]) {{{.*}}builtin} +// CIR: %[[PTR:.*]] = cir.call @_Znwm(%[[ALLOC_SIZE]]) {{{.*}}builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} // CIR: cir.cleanup.scope { // CIR: %[[PTR_A:.*]] = cir.cast bitcast %[[PTR]] : !cir.ptr<!void> -> !cir.ptr<!rec_A> // CIR: cir.store{{.*}} %[[PTR_A]], %[[NEW_RESULT]] : !cir.ptr<!rec_A>, !cir.ptr<!cir.ptr<!rec_A>> @@ -31,7 +31,7 @@ A *a() { // LLVM: define {{.*}} ptr @_Z1av() {{.*}} personality ptr @__gxx_personality_v0 { // LLVM: %[[RETVAL:.*]] = alloca ptr // LLVM: %[[NEW_RESULT:.*]] = alloca ptr -// LLVM: %[[PTR:.*]] = call nonnull ptr @_Znwm(i64 8) #[[ATTR_BUILTIN_NEW:.*]] +// LLVM: %[[PTR:.*]] = call noalias nonnull ptr @_Znwm(i64 8) #[[ATTR_BUILTIN_NEW:.*]] // LLVM: br label %[[EH_SCOPE:.*]] // LLVM: [[EH_SCOPE]]: // LLVM: store ptr %[[PTR]], ptr %[[NEW_RESULT]] @@ -91,7 +91,7 @@ A *b() { // CIR: %[[RETVAL:.*]] = cir.alloca "__retval" {{.*}} : !cir.ptr<!cir.ptr<!rec_A>> // CIR: %[[NEW_RESULT:.*]] = cir.alloca "__new_result" {{.*}} : !cir.ptr<!cir.ptr<!rec_A>> // CIR: %[[ALLOC_SIZE:.*]] = cir.const #cir.int<8> : !u64i -// CIR: %[[PTR:.*]] = cir.call @_Znwm(%[[ALLOC_SIZE]]) {{{.*}}builtin} +// CIR: %[[PTR:.*]] = cir.call @_Znwm(%[[ALLOC_SIZE]]) {{{.*}}builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} // CIR: cir.cleanup.scope { // CIR: %[[PTR_A:.*]] = cir.cast bitcast %[[PTR]] : !cir.ptr<!void> -> !cir.ptr<!rec_A> // CIR: cir.store{{.*}} %[[PTR_A]], %[[NEW_RESULT]] : !cir.ptr<!rec_A>, !cir.ptr<!cir.ptr<!rec_A>> @@ -106,7 +106,7 @@ A *b() { // LLVM: define {{.*}} ptr @_Z1bv() {{.*}} personality ptr @__gxx_personality_v0 { // LLVM: %[[RETVAL:.*]] = alloca ptr // LLVM: %[[NEW_RESULT:.*]] = alloca ptr -// LLVM: %[[PTR:.*]] = call nonnull ptr @_Znwm(i64 8) #[[ATTR_BUILTIN_NEW]] +// LLVM: %[[PTR:.*]] = call noalias nonnull ptr @_Znwm(i64 8) #[[ATTR_BUILTIN_NEW]] // LLVM: br label %[[EH_SCOPE:.*]] // LLVM: [[EH_SCOPE]]: // LLVM: store ptr %[[PTR]], ptr %[[NEW_RESULT]] @@ -294,7 +294,7 @@ C *test_new_delete_conditional(bool cond) { // LLVM: store i8 0, ptr %[[CLEANUP_FLAG:.*]], align 1 // LLVM: br i1 {{.*}}, label %[[TRUE_BB:.*]], label %[[FALSE_BB:.*]] // LLVM: [[TRUE_BB]]: -// LLVM: %[[NEWP:.*]] = call nonnull ptr @_Znwm(i64 1) #[[ATTR_BUILTIN_NEW]] +// LLVM: %[[NEWP:.*]] = call noalias nonnull ptr @_Znwm(i64 1) #[[ATTR_BUILTIN_NEW]] // LLVM: store ptr %[[NEWP]], ptr %[[SAVE_PTR:.*]], align 8 // LLVM: store i8 1, ptr %[[CLEANUP_FLAG]], align 1 // LLVM: invoke void @_ZN1CC1Ev(ptr {{.*}}%[[NEWP]]) @@ -459,7 +459,7 @@ D *test_new_delete_conditional_with_size(bool cond) { // LLVM: store i8 0, ptr %[[SD_FLAG:.*]], align 1 // LLVM: br i1 {{.*}}, label %[[SD_TRUE:.*]], label %[[SD_FALSE:.*]] // LLVM: [[SD_TRUE]]: -// LLVM: %[[SD_NEWP:.*]] = call nonnull ptr @_Znwm(i64 1) +// LLVM: %[[SD_NEWP:.*]] = call noalias nonnull ptr @_Znwm(i64 1) // LLVM: store ptr %[[SD_NEWP]], ptr %[[SD_SAVE_PTR:.*]], align 8 // LLVM: store i64 1, ptr %[[SD_SAVE_SIZE:.*]], align 8 // LLVM: store i8 1, ptr %[[SD_FLAG]], align 1 @@ -538,7 +538,7 @@ D *test_new_delete_conditional_array(bool cond, int n) { // LLVM: br i1 {{.*}}, label %[[ARR_TRUE:.*]], label %[[ARR_FALSE:.*]] // LLVM: [[ARR_TRUE]]: // LLVM: %[[ARR_ALLOC_SIZE:.*]] = select i1 %{{.*}}, i64 -1, i64 %{{.*}} -// LLVM: %[[ARR_NEWP:.*]] = call nonnull ptr @_Znam(i64 %[[ARR_ALLOC_SIZE]]) +// LLVM: %[[ARR_NEWP:.*]] = call noalias nonnull ptr @_Znam(i64 %[[ARR_ALLOC_SIZE]]) // LLVM: store ptr %[[ARR_NEWP]], ptr %[[ARR_SAVE_PTR:.*]], align 8 // LLVM: store i64 %[[ARR_ALLOC_SIZE]], ptr %[[ARR_SAVE_SIZE:.*]], align 8 // LLVM: store i8 1, ptr %[[ARR_FLAG]], align 1 @@ -573,7 +573,7 @@ D *test_new_delete_conditional_array(bool cond, int n) { // OGCG: %[[OGA_LOAD_SIZE:.*]] = load i64, ptr %[[OGA_SAVE_SIZE]], align 8 // OGCG: invoke void @_ZN1DdaEPvm(ptr %[[OGA_LOAD_PTR]], i64 %[[OGA_LOAD_SIZE]]) -// LLVM-DAG: attributes #[[ATTR_BUILTIN_NEW]] = {{{.*}}builtin{{.*}}} +// LLVM-DAG: attributes #[[ATTR_BUILTIN_NEW]] = {{{.*}}builtin{{.*}}memory(inaccessiblemem: readwrite, errnomem: write){{.*}}} // LLVM-DAG: attributes #[[ATTR_BUILTIN_DEL]] = {{{.*}}builtin{{.*}}} // OGCG-DAG: attributes #[[OGCG_ATTR_BUILTIN_NEW]] = {{{.*}}builtin{{.*}}} // OGCG-DAG: attributes #[[OGCG_ATTR_BUILTIN_DEL]] = {{{.*}}builtin{{.*}}} diff --git a/clang/test/CIR/CodeGen/new.cpp b/clang/test/CIR/CodeGen/new.cpp index 539f40e24c98d5..266f9596f0e1f7 100644 --- a/clang/test/CIR/CodeGen/new.cpp +++ b/clang/test/CIR/CodeGen/new.cpp @@ -163,7 +163,7 @@ void test_new_with_complex_type() { // CHECK: cir.func{{.*}} @_Z26test_new_with_complex_typev // CHECK: %[[A_ADDR:.*]] = cir.alloca "a" {{.*}} init : !cir.ptr<!cir.ptr<!cir.complex<!cir.float>>> // CHECK: %[[COMPLEX_SIZE:.*]] = cir.const #cir.int<8> : !u64i -// CHECK: %[[NEW_COMPLEX:.*]] = cir.call @_Znwm(%[[COMPLEX_SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) +// CHECK: %[[NEW_COMPLEX:.*]] = cir.call @_Znwm(%[[COMPLEX_SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CHECK: %[[COMPLEX_PTR:.*]] = cir.cast bitcast %[[NEW_COMPLEX]] : !cir.ptr<!void> -> !cir.ptr<!cir.complex<!cir.float>> // CHECK: %[[COMPLEX_VAL:.*]] = cir.const #cir.const_complex<#cir.fp<1.000000e+00> : !cir.float, #cir.fp<2.000000e+00> : !cir.float> : !cir.complex<!cir.float> // CHECK: cir.store{{.*}} %[[COMPLEX_VAL]], %[[COMPLEX_PTR]] : !cir.complex<!cir.float>, !cir.ptr<!cir.complex<!cir.float>> @@ -171,7 +171,7 @@ void test_new_with_complex_type() { // LLVM: define{{.*}} void @_Z26test_new_with_complex_typev // LLVM: %[[A_ADDR:.*]] = alloca ptr, align 8 -// LLVM: %[[NEW_COMPLEX:.*]] = call noundef nonnull ptr @_Znwm(i64 noundef 8) +// LLVM: %[[NEW_COMPLEX:.*]] = call noalias noundef nonnull ptr @_Znwm(i64 noundef 8) // LLVM: store { float, float } { float 1.000000e+00, float 2.000000e+00 }, ptr %[[NEW_COMPLEX]], align 8 // LLVM: store ptr %[[NEW_COMPLEX]], ptr %[[A_ADDR]], align 8 @@ -191,7 +191,7 @@ void t_new_constant_size() { // CHECK: cir.func{{.*}} @_Z19t_new_constant_sizev() // CHECK: %[[P_ADDR:.*]] = cir.alloca "p" align(8) init : !cir.ptr<!cir.ptr<!cir.double>> // CHECK: %[[ALLOCATION_SIZE:.*]] = cir.const #cir.int<128> : !u64i -// CHECK: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[ALLOCATION_SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) +// CHECK: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[ALLOCATION_SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CHECK: %[[TYPED_PTR:.*]] = cir.cast bitcast %[[RAW_PTR]] : !cir.ptr<!void> -> !cir.ptr<!cir.double> // CHECK: cir.store align(8) %[[TYPED_PTR]], %[[P_ADDR]] : !cir.ptr<!cir.double>, !cir.ptr<!cir.ptr<!cir.double>> // CHECK: cir.return @@ -199,7 +199,7 @@ void t_new_constant_size() { // LLVM: define{{.*}} void @_Z19t_new_constant_sizev // LLVM: %[[P_ADDR:.*]] = alloca ptr, align 8 -// LLVM: %[[CALL:.*]] = call noundef nonnull ptr @_Znam(i64 noundef 128) +// LLVM: %[[CALL:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 128) // LLVM: store ptr %[[CALL]], ptr %[[P_ADDR]], align 8 // OGCG: define{{.*}} void @_Z19t_new_constant_sizev @@ -220,7 +220,7 @@ void t_constant_size_nontrivial() { // CHECK: %[[P_ADDR:.*]] = cir.alloca "p" align(8) init : !cir.ptr<!cir.ptr<!rec_C>> // CHECK: %[[NUM_ELEMENTS:.*]] = cir.const #cir.int<3> : !u64i // CHECK: %[[ALLOCATION_SIZE:.*]] = cir.const #cir.int<11> : !u64i -// CHECK: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[ALLOCATION_SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) +// CHECK: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[ALLOCATION_SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CHECK: %[[COOKIE_PTR_BASE:.*]] = cir.cast bitcast %[[RAW_PTR]] : !cir.ptr<!void> -> !cir.ptr<!u8i> // CHECK: %[[COOKIE_PTR:.*]] = cir.cast bitcast %[[COOKIE_PTR_BASE]] : !cir.ptr<!u8i> -> !cir.ptr<!u64i> // CHECK: cir.store align(8) %[[NUM_ELEMENTS]], %[[COOKIE_PTR]] : !u64i, !cir.ptr<!u64i> @@ -234,7 +234,7 @@ void t_constant_size_nontrivial() { // LLVM: @_Z26t_constant_size_nontrivialv() // LLVM: %[[ALLOCA:.*]] = alloca ptr, align 8 -// LLVM: %[[COOKIE_PTR:.*]] = call noundef nonnull ptr @_Znam(i64 noundef 11) +// LLVM: %[[COOKIE_PTR:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 11) // LLVM: store i64 3, ptr %[[COOKIE_PTR]], align 8 // LLVM: %[[ALLOCATED_PTR:.*]] = getelementptr i8, ptr %[[COOKIE_PTR]], i64 8 // LLVM: store ptr %[[ALLOCATED_PTR]], ptr %[[ALLOCA]], align 8 @@ -260,7 +260,7 @@ void t_constant_size_nontrivial2() { // CHECK: %[[P_ADDR:.*]] = cir.alloca "p" align(8) init : !cir.ptr<!cir.ptr<!rec_D>> // CHECK: %[[NUM_ELEMENTS:.*]] = cir.const #cir.int<3> : !u64i // CHECK: %[[ALLOCATION_SIZE:.*]] = cir.const #cir.int<20> : !u64i -// CHECK: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[ALLOCATION_SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) +// CHECK: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[ALLOCATION_SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CHECK: %[[COOKIE_PTR_BASE:.*]] = cir.cast bitcast %[[RAW_PTR]] : !cir.ptr<!void> -> !cir.ptr<!u8i> // CHECK: %[[COOKIE_PTR:.*]] = cir.cast bitcast %[[COOKIE_PTR_BASE]] : !cir.ptr<!u8i> -> !cir.ptr<!u64i> // CHECK: cir.store align(8) %[[NUM_ELEMENTS]], %[[COOKIE_PTR]] : !u64i, !cir.ptr<!u64i> @@ -274,7 +274,7 @@ void t_constant_size_nontrivial2() { // LLVM: @_Z27t_constant_size_nontrivial2v() // LLVM: %[[ALLOCA:.*]] = alloca ptr, align 8 -// LLVM: %[[COOKIE_PTR:.*]] = call noundef nonnull ptr @_Znam(i64 noundef 20) +// LLVM: %[[COOKIE_PTR:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 20) // LLVM: store i64 3, ptr %[[COOKIE_PTR]], align 8 // LLVM: %[[ALLOCATED_PTR:.*]] = getelementptr i8, ptr %[[COOKIE_PTR]], i64 8 // LLVM: store ptr %[[ALLOCATED_PTR]], ptr %[[ALLOCA]], align 8 @@ -292,7 +292,7 @@ void t_align16_nontrivial() { // CHECK: %[[P_ADDR:.*]] = cir.alloca "p" align(8) init : !cir.ptr<!cir.ptr<!rec_E>> // CHECK: %[[NUM_ELEMENTS:.*]] = cir.const #cir.int<2> : !u64i // CHECK: %[[ALLOCATION_SIZE:.*]] = cir.const #cir.int<48> : !u64i -// CHECK: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[ALLOCATION_SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) +// CHECK: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[ALLOCATION_SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CHECK: %[[COOKIE_PTR_BASE:.*]] = cir.cast bitcast %[[RAW_PTR]] : !cir.ptr<!void> -> !cir.ptr<!u8i> // CHECK: %[[COOKIE_OFFSET:.*]] = cir.const #cir.int<8> : !s32i // CHECK: %[[COOKIE_PTR_RAW:.*]] = cir.ptr_stride %[[COOKIE_PTR_BASE]], %[[COOKIE_OFFSET]] : (!cir.ptr<!u8i>, !s32i) -> !cir.ptr<!u8i> @@ -308,7 +308,7 @@ void t_align16_nontrivial() { // LLVM: @_Z20t_align16_nontrivialv() // LLVM: %[[ALLOCA:.*]] = alloca ptr, align 8 -// LLVM: %[[RAW_PTR:.*]] = call noundef nonnull ptr @_Znam(i64 noundef 48) +// LLVM: %[[RAW_PTR:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 48) // LLVM: %[[COOKIE_PTR:.*]] = getelementptr i8, ptr %[[RAW_PTR]], i64 8 // LLVM: store i64 2, ptr %[[COOKIE_PTR]], align 8 // LLVM: %[[ALLOCATED_PTR:.*]] = getelementptr i8, ptr %[[RAW_PTR]], i64 16 @@ -330,14 +330,14 @@ void t_new_multidim_constant_size() { // CHECK: cir.func{{.*}} @_Z28t_new_multidim_constant_sizev() // CHECK: %[[P_ADDR:.*]] = cir.alloca "p" align(8) init : !cir.ptr<!cir.ptr<!cir.array<!cir.array<!cir.double x 4> x 3>>> // CHECK: %[[ALLOCATION_SIZE:.*]] = cir.const #cir.int<192> : !u64i -// CHECK: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[ALLOCATION_SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) +// CHECK: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[ALLOCATION_SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CHECK: %[[TYPED_PTR:.*]] = cir.cast bitcast %[[RAW_PTR]] : !cir.ptr<!void> -> !cir.ptr<!cir.array<!cir.array<!cir.double x 4> x 3>> // CHECK: cir.store align(8) %[[TYPED_PTR]], %[[P_ADDR]] : !cir.ptr<!cir.array<!cir.array<!cir.double x 4> x 3>>, !cir.ptr<!cir.ptr<!cir.array<!cir.array<!cir.double x 4> x 3>>> // CHECK: } // LLVM: define{{.*}} void @_Z28t_new_multidim_constant_sizev // LLVM: %[[P_ADDR:.*]] = alloca ptr, align 8 -// LLVM: %[[CALL:.*]] = call noundef nonnull ptr @_Znam(i64 noundef 192) +// LLVM: %[[CALL:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 192) // LLVM: store ptr %[[CALL]], ptr %[[P_ADDR]], align 8 // OGCG: define{{.*}} void @_Z28t_new_multidim_constant_sizev @@ -351,14 +351,14 @@ void t_constant_size_memset_init() { // CHECK: cir.func {{.*}} @_Z27t_constant_size_memset_initv() // CHECK: %[[ALLOCATION_SIZE:.*]] = cir.const #cir.int<64> : !u64i -// CHECK: %[[ALLOC_PTR:.*]] = cir.call @_Znam(%[[ALLOCATION_SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) +// CHECK: %[[ALLOC_PTR:.*]] = cir.call @_Znam(%[[ALLOCATION_SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CHECK: %[[ELEM_PTR:.*]] = cir.cast bitcast %[[ALLOC_PTR]] : !cir.ptr<!void> -> !cir.ptr<!s32i> // CHECK: %[[VOID_PTR:.*]] = cir.cast bitcast %[[ELEM_PTR]] : !cir.ptr<!s32i> -> !cir.ptr<!void> // CHECK: %[[ZERO:.*]] = cir.const #cir.int<0> : !u8i // CHECK: cir.libc.memset %[[ALLOCATION_SIZE]] bytes at %[[VOID_PTR]]{{.*}} to %[[ZERO]] : !cir.ptr<!void>, !u8i, !u64i // LLVM: define {{.*}} void @_Z27t_constant_size_memset_initv() -// LLVM: %[[P:.*]] = call noundef nonnull ptr @_Znam(i64 noundef 64) +// LLVM: %[[P:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 64) // LLVM: call void @llvm.memset.p0.i64(ptr{{.*}} %[[P]], i8 0, i64 64, i1 false) // OGCG: define {{.*}} void @_Z27t_constant_size_memset_initv() @@ -371,7 +371,7 @@ void t_constant_size_full_init() { // CHECK: cir.func {{.*}} @_Z25t_constant_size_full_initv() // CHECK: %[[ALLOCATION_SIZE:.*]] = cir.const #cir.int<16> : !u64i -// CHECK: %[[ALLOC_PTR:.*]] = cir.call @_Znam(%[[ALLOCATION_SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) +// CHECK: %[[ALLOC_PTR:.*]] = cir.call @_Znam(%[[ALLOCATION_SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CHECK: %[[ELEM_0_PTR:.*]] = cir.cast bitcast %[[ALLOC_PTR]] : !cir.ptr<!void> -> !cir.ptr<!s32i> // CHECK: %[[CONST_ONE:.*]] = cir.const #cir.int<1> : !s32i // CHECK: cir.store{{.*}} %[[CONST_ONE]], %[[ELEM_0_PTR]] : !s32i, !cir.ptr<!s32i> @@ -389,7 +389,7 @@ void t_constant_size_full_init() { // CHECK: cir.store{{.*}} %[[CONST_FOUR]], %[[ELEM_3_PTR]] : !s32i, !cir.ptr<!s32i> // LLVM: define {{.*}} void @_Z25t_constant_size_full_initv() -// LLVM: %[[P:.*]] = call noundef nonnull ptr @_Znam(i64 noundef 16) +// LLVM: %[[P:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 16) // LLVM: store i32 1, ptr %[[CALL]] // LLVM: %[[ELEM_1:.*]] = getelementptr i32, ptr %[[P]], i64 1 // LLVM: store i32 2, ptr %[[ELEM_1]] @@ -414,7 +414,7 @@ void t_constant_size_partial_init() { // CHECK: cir.func {{.*}} @_Z28t_constant_size_partial_initv() // CHECK: %[[ALLOCATION_SIZE:.*]] = cir.const #cir.int<64> : !u64i -// CHECK: %[[ALLOC_PTR:.*]] = cir.call @_Znam(%[[ALLOCATION_SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) +// CHECK: %[[ALLOC_PTR:.*]] = cir.call @_Znam(%[[ALLOCATION_SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CHECK: %[[ELEM_0_PTR:.*]] = cir.cast bitcast %[[ALLOC_PTR]] : !cir.ptr<!void> -> !cir.ptr<!s32i> // CHECK: %[[CONST_ONE:.*]] = cir.const #cir.int<1> : !s32i // CHECK: cir.store{{.*}} %[[CONST_ONE]], %[[ELEM_0_PTR]] : !s32i, !cir.ptr<!s32i> @@ -435,7 +435,7 @@ void t_constant_size_partial_init() { // CHECK: cir.libc.memset %[[REMAINING_SIZE]] bytes at %[[VOID_PTR]]{{.*}} to %[[ZERO]] : !cir.ptr<!void>, !u8i, !u64i // LLVM: define {{.*}} void @_Z28t_constant_size_partial_initv() -// LLVM: %[[P:.*]] = call noundef nonnull ptr @_Znam(i64 {{.*}} 64) +// LLVM: %[[P:.*]] = call noalias noundef nonnull ptr @_Znam(i64 {{.*}} 64) // LLVM: store i32 1, ptr %[[P]] // LLVM: %[[ELEM_1:.*]] = getelementptr i32, ptr %[[P]], i64 1 // LLVM: store i32 2, ptr %[[ELEM_1]] @@ -460,11 +460,11 @@ void t_new_var_size(size_t n) { // CHECK: cir.func {{.*}} @_Z14t_new_var_sizem // CHECK: %[[N:.*]] = cir.load{{.*}} %[[ARG_ALLOCA:.*]] -// CHECK: %[[PTR:.*]] = cir.call @_Znam(%[[N]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) +// CHECK: %[[PTR:.*]] = cir.call @_Znam(%[[N]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) // LLVM: define{{.*}} void @_Z14t_new_var_sizem // LLVM: %[[N:.*]] = load i64, ptr %{{.+}} -// LLVM: %[[PTR:.*]] = call noundef nonnull ptr @_Znam(i64 {{.*}} %[[N]]) +// LLVM: %[[PTR:.*]] = call noalias noundef nonnull ptr @_Znam(i64 {{.*}} %[[N]]) // OGCG: define{{.*}} void @_Z14t_new_var_sizem // OGCG: %[[N:.*]] = load i64, ptr %{{.+}} @@ -477,12 +477,12 @@ void t_new_var_size2(int n) { // CHECK: cir.func {{.*}} @_Z15t_new_var_size2i // CHECK: %[[N:.*]] = cir.load{{.*}} %[[ARG_ALLOCA:.*]] // CHECK: %[[N_SIZE_T:.*]] = cir.cast integral %[[N]] : !s32i -> !u64i -// CHECK: %[[PTR:.*]] = cir.call @_Znam(%[[N_SIZE_T]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) +// CHECK: %[[PTR:.*]] = cir.call @_Znam(%[[N_SIZE_T]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) // LLVM: define{{.*}} void @_Z15t_new_var_size2i // LLVM: %[[N:.*]] = load i32, ptr %{{.+}} // LLVM: %[[N_SIZE_T:.*]] = sext i32 %[[N]] to i64 -// LLVM: %[[PTR:.*]] = call noundef nonnull ptr @_Znam(i64 {{.*}} %[[N_SIZE_T]]) +// LLVM: %[[PTR:.*]] = call noalias noundef nonnull ptr @_Znam(i64 {{.*}} %[[N_SIZE_T]]) // OGCG: define{{.*}} void @_Z15t_new_var_size2i // OGCG: %[[N:.*]] = load i32, ptr %{{.+}} @@ -499,7 +499,7 @@ void t_new_var_size3(size_t n) { // CHECK: %[[RESULT:.*]], %[[OVERFLOW:.*]] = cir.mul.overflow %[[N]], %[[ELEMENT_SIZE]] : !u64i -> !u64i // CHECK: %[[ALL_ONES:.*]] = cir.const #cir.int<18446744073709551615> : !u64i // CHECK: %[[ALLOC_SIZE:.*]] = cir.select if %[[OVERFLOW]] then %[[ALL_ONES]] else %[[RESULT]] : (!cir.bool, !u64i, !u64i) -// CHECK: %[[PTR:.*]] = cir.call @_Znam(%[[ALLOC_SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) +// CHECK: %[[PTR:.*]] = cir.call @_Znam(%[[ALLOC_SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) // LLVM: define{{.*}} void @_Z15t_new_var_size3m // LLVM: %[[N:.*]] = load i64, ptr %{{.+}} @@ -507,7 +507,7 @@ void t_new_var_size3(size_t n) { // LLVM: %[[ELEMENT_SIZE:.*]] = extractvalue { i64, i1 } %[[MUL_OVERFLOW]], 0 // LLVM: %[[OVERFLOW:.*]] = extractvalue { i64, i1 } %[[MUL_OVERFLOW]], 1 // LLVM: %[[ALLOC_SIZE:.*]] = select i1 %[[OVERFLOW]], i64 -1, i64 %[[ELEMENT_SIZE]] -// LLVM: %[[RESULT:.*]] = call noundef nonnull ptr @_Znam(i64 {{.*}} %[[ALLOC_SIZE]]) +// LLVM: %[[RESULT:.*]] = call noalias noundef nonnull ptr @_Znam(i64 {{.*}} %[[ALLOC_SIZE]]) // OGCG: define{{.*}} void @_Z15t_new_var_size3m // OGCG: %[[N:.*]] = load i64, ptr %{{.+}} @@ -528,7 +528,7 @@ void t_new_var_size4(int n) { // CHECK: %[[RESULT:.*]], %[[OVERFLOW:.*]] = cir.mul.overflow %[[N_SIZE_T]], %[[ELEMENT_SIZE]] : !u64i -> !u64i // CHECK: %[[ALL_ONES:.*]] = cir.const #cir.int<18446744073709551615> : !u64i // CHECK: %[[ALLOC_SIZE:.*]] = cir.select if %[[OVERFLOW]] then %[[ALL_ONES]] else %[[RESULT]] : (!cir.bool, !u64i, !u64i) -// CHECK: %[[PTR:.*]] = cir.call @_Znam(%[[ALLOC_SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) +// CHECK: %[[PTR:.*]] = cir.call @_Znam(%[[ALLOC_SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) // LLVM: define{{.*}} void @_Z15t_new_var_size4i // LLVM: %[[N:.*]] = load i32, ptr %{{.+}} @@ -537,7 +537,7 @@ void t_new_var_size4(int n) { // LLVM: %[[ELEMENT_SIZE:.*]] = extractvalue { i64, i1 } %[[MUL_OVERFLOW]], 0 // LLVM: %[[OVERFLOW:.*]] = extractvalue { i64, i1 } %[[MUL_OVERFLOW]], 1 // LLVM: %[[ALLOC_SIZE:.*]] = select i1 %[[OVERFLOW]], i64 -1, i64 %[[ELEMENT_SIZE]] -// LLVM: %[[PTR:.*]] = call noundef nonnull ptr @_Znam(i64 {{.*}} %[[ALLOC_SIZE]]) +// LLVM: %[[PTR:.*]] = call noalias noundef nonnull ptr @_Znam(i64 {{.*}} %[[ALLOC_SIZE]]) // OGCG: define{{.*}} void @_Z15t_new_var_size4i // OGCG: %[[N:.*]] = load i32, ptr %{{.+}} @@ -562,7 +562,7 @@ void t_new_var_size5(int n) { // CHECK: %[[RESULT:.*]], %[[OVERFLOW:.*]] = cir.mul.overflow %[[N_SIZE_T]], %[[ELEMENT_SIZE]] : !u64i -> !u64i // CHECK: %[[ALL_ONES:.*]] = cir.const #cir.int<18446744073709551615> : !u64i // CHECK: %[[ALLOC_SIZE:.*]] = cir.select if %[[OVERFLOW]] then %[[ALL_ONES]] else %[[RESULT]] : (!cir.bool, !u64i, !u64i) -// CHECK: %[[PTR:.*]] = cir.call @_Znam(%[[ALLOC_SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) +// CHECK: %[[PTR:.*]] = cir.call @_Znam(%[[ALLOC_SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) // LLVM: define{{.*}} void @_Z15t_new_var_size5i // LLVM: %[[N:.*]] = load i32, ptr %{{.+}} @@ -571,7 +571,7 @@ void t_new_var_size5(int n) { // LLVM: %[[ELEMENT_SIZE:.*]] = extractvalue { i64, i1 } %[[MUL_OVERFLOW]], 0 // LLVM: %[[OVERFLOW:.*]] = extractvalue { i64, i1 } %[[MUL_OVERFLOW]], 1 // LLVM: %[[ALLOC_SIZE:.*]] = select i1 %[[OVERFLOW]], i64 -1, i64 %[[ELEMENT_SIZE]] -// LLVM: %[[PTR:.*]] = call noundef nonnull ptr @_Znam(i64 {{.*}} %[[ALLOC_SIZE]]) +// LLVM: %[[PTR:.*]] = call noalias noundef nonnull ptr @_Znam(i64 {{.*}} %[[ALLOC_SIZE]]) // OGCG: define{{.*}} void @_Z15t_new_var_size5i // OGCG: %[[N:.*]] = load i32, ptr %{{.+}} @@ -596,7 +596,7 @@ void t_new_var_size6(int n) { // CHECK: %[[ANY_OVERFLOW:.*]] = cir.or %[[LT_MIN_SIZE]], %[[OVERFLOW]] : !cir.bool // CHECK: %[[ALL_ONES:.*]] = cir.const #cir.int<18446744073709551615> : !u64i // CHECK: %[[ALLOC_SIZE:.*]] = cir.select if %[[ANY_OVERFLOW]] then %[[ALL_ONES]] else %[[RESULT]] : (!cir.bool, !u64i, !u64i) -// CHECK: %[[PTR:.*]] = cir.call @_Znam(%[[ALLOC_SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) +// CHECK: %[[PTR:.*]] = cir.call @_Znam(%[[ALLOC_SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) // CHECK: %[[PTR_DOUBLE:.*]] = cir.cast bitcast %[[PTR]] : !cir.ptr<!void> -> !cir.ptr<!cir.double> // CHECK: %[[ELEM_0:.*]] = cir.const #cir.fp<1.000000e+00> : !cir.double // CHECK: cir.store{{.*}} %[[ELEM_0]], %[[PTR_DOUBLE]] @@ -625,7 +625,7 @@ void t_new_var_size6(int n) { // LLVM: %[[OVERFLOW:.*]] = extractvalue { i64, i1 } %[[MUL_OVERFLOW]], 1 // LLVM: %[[ANY_OVERFLOW:.*]] = or i1 %[[LT_MIN_SIZE]], %[[OVERFLOW]] // LLVM: %[[ALLOC_SIZE:.*]] = select i1 %[[ANY_OVERFLOW]], i64 -1, i64 %[[ELEMENT_SIZE]] -// LLVM: %[[PTR:.*]] = call noundef nonnull ptr @_Znam(i64 {{.*}} %[[ALLOC_SIZE]]) +// LLVM: %[[PTR:.*]] = call noalias noundef nonnull ptr @_Znam(i64 {{.*}} %[[ALLOC_SIZE]]) // LLVM: store double 1.000000e+00, ptr %[[PTR]], align 8 // LLVM: %[[ELEM_1:.*]] = getelementptr double, ptr %[[PTR]], i64 1 // LLVM: store double 2.000000e+00, ptr %[[ELEM_1]], align 8 @@ -665,7 +665,7 @@ void t_new_var_size7(__int128 n) { // CHECK: %[[RESULT:.*]], %[[OVERFLOW:.*]] = cir.mul.overflow %[[N_SIZE_T]], %[[ELEMENT_SIZE]] : !u64i -> !u64i // CHECK: %[[ALL_ONES:.*]] = cir.const #cir.int<18446744073709551615> : !u64i // CHECK: %[[ALLOC_SIZE:.*]] = cir.select if %[[OVERFLOW]] then %[[ALL_ONES]] else %[[RESULT]] : (!cir.bool, !u64i, !u64i) -// CHECK: %[[PTR:.*]] = cir.call @_Znam(%[[ALLOC_SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) +// CHECK: %[[PTR:.*]] = cir.call @_Znam(%[[ALLOC_SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) // LLVM: define{{.*}} void @_Z15t_new_var_size7n // LLVM: %[[N:.*]] = load i128, ptr %{{.+}} @@ -674,7 +674,7 @@ void t_new_var_size7(__int128 n) { // LLVM: %[[ELEMENT_SIZE:.*]] = extractvalue { i64, i1 } %[[MUL_OVERFLOW]], 0 // LLVM: %[[OVERFLOW:.*]] = extractvalue { i64, i1 } %[[MUL_OVERFLOW]], 1 // LLVM: %[[ALLOC_SIZE:.*]] = select i1 %[[OVERFLOW]], i64 -1, i64 %[[ELEMENT_SIZE]] -// LLVM: %[[PTR:.*]] = call noundef nonnull ptr @_Znam(i64 {{.*}} %[[ALLOC_SIZE]]) +// LLVM: %[[PTR:.*]] = call noalias noundef nonnull ptr @_Znam(i64 {{.*}} %[[ALLOC_SIZE]]) // OGCG: define{{.*}} void @_Z15t_new_var_size7n // OGCG: %[[N:.*]] = load i128, ptr %{{.+}} @@ -698,7 +698,7 @@ void t_new_var_size_nontrivial(size_t n) { // CHECK: %[[ANY_OVERFLOW:.*]] = cir.or %[[OVERFLOW]], %[[OVERFLOW2]] : !cir.bool // CHECK: %[[ALL_ONES:.*]] = cir.const #cir.int<18446744073709551615> : !u64i // CHECK: %[[ALLOC_SIZE:.*]] = cir.select if %[[ANY_OVERFLOW]] then %[[ALL_ONES]] else %[[SIZE]] : (!cir.bool, !u64i, !u64i) -// CHECK: %[[PTR:.*]] = cir.call @_Znam(%[[ALLOC_SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) +// CHECK: %[[PTR:.*]] = cir.call @_Znam(%[[ALLOC_SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) // LLVM: define{{.*}} void @_Z25t_new_var_size_nontrivialm // LLVM: %[[N:.*]] = load i64, ptr %{{.+}} @@ -710,7 +710,7 @@ void t_new_var_size_nontrivial(size_t n) { // LLVM: %[[OVERFLOW_ADD:.*]] = extractvalue { i64, i1 } %[[ADD_OVERFLOW]], 1 // LLVM: %[[ANY_OVERFLOW:.*]] = or i1 %[[OVERFLOW]], %[[OVERFLOW_ADD]] // LLVM: %[[ALLOC_SIZE:.*]] = select i1 %[[ANY_OVERFLOW]], i64 -1, i64 %[[ELEMENT_SIZE]] -// LLVM: %[[PTR:.*]] = call noundef nonnull ptr @_Znam(i64 {{.*}} %[[ALLOC_SIZE]]) +// LLVM: %[[PTR:.*]] = call noalias noundef nonnull ptr @_Znam(i64 {{.*}} %[[ALLOC_SIZE]]) // OGCG: define{{.*}} void @_Z25t_new_var_size_nontrivialm // OGCG: %[[N:.*]] = load i64, ptr %{{.+}} @@ -736,7 +736,7 @@ void test_array_new_with_ctor_init() { // CIR-BEFORE-LPP: cir.func {{.*}} @_Z29test_array_new_with_ctor_initv // CIR-BEFORE-LPP: %[[P_ADDR:.*]] = cir.alloca "p" {{.*}} init : !cir.ptr<!cir.ptr<!rec_F>> // CIR-BEFORE-LPP: %[[THREE:.*]] = cir.const #cir.int<3> : !u64i -// CIR-BEFORE-LPP: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[THREE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) +// CIR-BEFORE-LPP: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[THREE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) // CIR-BEFORE-LPP: %[[BEGIN:.*]] = cir.cast bitcast %[[RAW_PTR]] : !cir.ptr<!void> -> !cir.ptr<!rec_F> // CIR-BEFORE-LPP: %[[ARRAY_PTR:.*]] = cir.cast bitcast %[[BEGIN]] : !cir.ptr<!rec_F> -> !cir.ptr<!cir.array<!rec_F x 3>> // CIR-BEFORE-LPP: cir.array.ctor %[[ARRAY_PTR]] : !cir.ptr<!cir.array<!rec_F x 3>> { @@ -749,7 +749,7 @@ void test_array_new_with_ctor_init() { // CHECK: cir.func {{.*}} @_Z29test_array_new_with_ctor_initv // CHECK: %[[P_ADDR:.*]] = cir.alloca "p" {{.*}} init : !cir.ptr<!cir.ptr<!rec_F>> // CHECK: %[[THREE:.*]] = cir.const #cir.int<3> : !u64i -// CHECK: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[THREE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) +// CHECK: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[THREE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) // CHECK: %[[BEGIN:.*]] = cir.cast bitcast %[[RAW_PTR]] : !cir.ptr<!void> -> !cir.ptr<!rec_F> // CHECK: %[[ARRAY_PTR:.*]] = cir.cast bitcast %[[BEGIN]] : !cir.ptr<!rec_F> -> !cir.ptr<!cir.array<!rec_F x 3>> // CHECK: %[[THREE_2:.*]] = cir.const #cir.int<3> : !u64i @@ -774,7 +774,7 @@ void test_array_new_with_ctor_init() { // LLVM: define{{.*}} void @_Z29test_array_new_with_ctor_initv // LLVM: %[[P_ADDR:.*]] = alloca ptr, align 8 -// LLVM: %[[RAW_PTR:.*]] = call noundef nonnull ptr @_Znam(i64 noundef 3) +// LLVM: %[[RAW_PTR:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 3) // LLVM: %[[BEGIN:.*]] = getelementptr %class.F, ptr %[[RAW_PTR]], i32 0 // LLVM: %[[ARRAY_END:.*]] = getelementptr %class.F, ptr %[[BEGIN]], i64 3 // LLVM: %[[IDX_ADDR:.*]] = alloca ptr, align 1 @@ -831,7 +831,7 @@ void test_array_new_var_sized_with_ctor_init(int size) { // LLVM: define{{.*}} void @_Z39test_array_new_var_sized_with_ctor_initi // LLVM: %[[N:.*]] = load i32, ptr %{{.+}} // LLVM: %[[N64:.*]] = sext i32 %[[N]] to i64 -// LLVM: %[[RAW:.*]] = call noundef nonnull ptr @_Znam(i64 {{.*}} %[[N64]]) +// LLVM: %[[RAW:.*]] = call noalias noundef nonnull ptr @_Znam(i64 {{.*}} %[[N64]]) // LLVM: %[[CMP:.*]] = icmp ne i64 %[[N64]], 0 // LLVM: br i1 %[[CMP]] @@ -894,7 +894,7 @@ void test_const_array_new_value_init() { // rather than a bulk llvm.memset over the whole allocation. // // LLVM: define{{.*}} void @_Z31test_const_array_new_value_initv -// LLVM: %[[RAW:.*]] = call noundef nonnull ptr @_Znam(i64 noundef 3) +// LLVM: %[[RAW:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 3) // LLVM: %[[BEGIN:.*]] = getelementptr %class.OuterZero, ptr %[[RAW]], i32 0 // LLVM: %[[END:.*]] = getelementptr %class.OuterZero, ptr %[[BEGIN]], i64 3 // LLVM: store ptr %[[BEGIN]], ptr %[[IDX:.*]], align 8 @@ -1018,7 +1018,7 @@ void test_multidim_array_new_with_ctor() { // CHECK: } // LLVM: define{{.*}} void @_Z33test_multidim_array_new_with_ctorv -// LLVM: %[[RAW:.*]] = call noundef nonnull ptr @_Znam(i64 noundef 6) +// LLVM: %[[RAW:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 6) // LLVM: %[[BEGIN:.*]] = getelementptr %class.F, ptr %[[RAW]], i32 0 // LLVM: %[[END:.*]] = getelementptr %class.F, ptr %[[BEGIN]], i64 6 // LLVM: store ptr %[[BEGIN]], ptr %[[IDX:.*]], align 8 @@ -1091,7 +1091,7 @@ void test_multidim_var_array_new_with_ctor(int n) { // LLVM: %[[N64:.*]] = sext i32 %[[N]] to i64 // LLVM: %[[MUL:.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %[[N64]], i64 3) // LLVM: %[[TOTAL:.*]] = extractvalue { i64, i1 } %[[MUL]], 0 -// LLVM: %[[RAW:.*]] = call noundef nonnull ptr @_Znam(i64 noundef %{{.*}}) +// LLVM: %[[RAW:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef %{{.*}}) // LLVM: %[[END:.*]] = getelementptr %class.F, ptr %[[RAW]], i64 %[[TOTAL]] // LLVM: %[[CMP:.*]] = icmp ne i64 %[[TOTAL]], 0 // LLVM: br i1 %[[CMP]] @@ -1122,7 +1122,7 @@ void test_array_new_with_ctor_partial_init_list() { // CIR-BEFORE-LPP: cir.func {{.*}} @_Z42test_array_new_with_ctor_partial_init_listv // CIR-BEFORE-LPP: %[[P_ADDR:.*]] = cir.alloca "p" {{.*}} init : !cir.ptr<!cir.ptr<!rec_G>> // CIR-BEFORE-LPP: %[[EIGHT:.*]] = cir.const #cir.int<8> : !u64i -// CIR-BEFORE-LPP: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[EIGHT]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) +// CIR-BEFORE-LPP: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[EIGHT]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) // CIR-BEFORE-LPP: %[[BEGIN:.*]] = cir.cast bitcast %[[RAW_PTR]] : !cir.ptr<!void> -> !cir.ptr<!rec_G> // CIR-BEFORE-LPP: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i // CIR-BEFORE-LPP: cir.call @_ZN1GC1Ei(%[[BEGIN]], %[[ONE]]) : (!cir.ptr<!rec_G> {{.*}}, !s32i {llvm.noundef}) -> () @@ -1143,7 +1143,7 @@ void test_array_new_with_ctor_partial_init_list() { // CHECK: cir.func {{.*}} @_Z42test_array_new_with_ctor_partial_init_listv // CHECK: %[[P_ADDR:.*]] = cir.alloca "p" {{.*}} init : !cir.ptr<!cir.ptr<!rec_G>> // CHECK: %[[EIGHT:.*]] = cir.const #cir.int<8> : !u64i -// CHECK: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[EIGHT]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) +// CHECK: %[[RAW_PTR:.*]] = cir.call @_Znam(%[[EIGHT]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) // CHECK: %[[BEGIN:.*]] = cir.cast bitcast %[[RAW_PTR]] : !cir.ptr<!void> -> !cir.ptr<!rec_G> // CHECK: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i // CHECK: cir.call @_ZN1GC1Ei(%[[BEGIN]], %[[ONE]]) : (!cir.ptr<!rec_G> {{.*}}, !s32i {llvm.noundef}) -> () @@ -1176,7 +1176,7 @@ void test_array_new_with_ctor_partial_init_list() { // LLVM: define{{.*}} void @_Z42test_array_new_with_ctor_partial_init_listv // LLVM: %[[P_ADDR:.*]] = alloca ptr, align 8 -// LLVM: %[[RAW_PTR:.*]] = call noundef nonnull ptr @_Znam(i64 noundef 8) +// LLVM: %[[RAW_PTR:.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 8) // LLVM: call void @_ZN1GC1Ei(ptr noundef nonnull align 1 dereferenceable(1) %[[RAW_PTR]], i32 noundef 1) // LLVM: %[[SECOND:.*]] = getelementptr %class.G, ptr %[[RAW_PTR]], i64 1 // LLVM: call void @_ZN1GC1Ei(ptr noundef nonnull align 1 dereferenceable(1) %[[SECOND]], i32 noundef 2) diff --git a/clang/test/CIR/CodeGen/operator-new-noalias.cpp b/clang/test/CIR/CodeGen/operator-new-noalias.cpp new file mode 100644 index 00000000000000..a3652dea732f8e --- /dev/null +++ b/clang/test/CIR/CodeGen/operator-new-noalias.cpp @@ -0,0 +1,24 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir +// RUN: FileCheck --check-prefix=CIR --input-file=%t.cir %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t-cir.ll +// RUN: FileCheck --check-prefix=LLVM --input-file=%t-cir.ll %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o %t.ll +// RUN: FileCheck --check-prefix=OGCG --input-file=%t.ll %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-assume-sane-operator-new -fclangir -emit-llvm %s -o %t-nosane-cir.ll +// RUN: FileCheck --check-prefix=NOSANE --input-file=%t-nosane-cir.ll %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fno-assume-sane-operator-new -emit-llvm %s -o %t-nosane.ll +// RUN: FileCheck --check-prefix=NOSANE --input-file=%t-nosane.ll %s + +void *test_new() { return new int; } + +// CIR: cir.call @_Znwm(%{{.*}}) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : {{.*}} -> (!cir.ptr<!void> {llvm.noalias{{.*}}}) + +// LLVM: call noalias noundef nonnull ptr @_Znwm(i64 noundef 4) [[ATTR:#[0-9]+]] +// OGCG: call noalias noundef nonnull ptr @_Znwm(i64 noundef 4) [[ATTR:#[0-9]+]] +// LLVM: attributes [[ATTR]] = { builtin allocsize(0) memory(inaccessiblemem: readwrite, errnomem: write) } +// OGCG: attributes [[ATTR]] = { builtin allocsize(0) memory(inaccessiblemem: readwrite, errnomem: write) } + +// NOSANE: call noundef nonnull ptr @_Znwm(i64 noundef 4) [[NOSANE_ATTR:#[0-9]+]] +// NOSANE-NOT: call noalias +// NOSANE: attributes [[NOSANE_ATTR]] = { builtin allocsize(0) } +// NOSANE-NOT: inaccessiblemem diff --git a/clang/test/CIR/CodeGen/paren-list-agg-init.cpp b/clang/test/CIR/CodeGen/paren-list-agg-init.cpp index ae57f5887cb933..51d1005be6c3fe 100644 --- a/clang/test/CIR/CodeGen/paren-list-agg-init.cpp +++ b/clang/test/CIR/CodeGen/paren-list-agg-init.cpp @@ -808,7 +808,7 @@ namespace gh68198 { // CIR-LABEL: cir.{{.*}}@_ZN7gh681985foo25Ev() // CIR: %[[ARR_ALLOCA:.*]] = cir.alloca "arr8" align(8) init : !cir.ptr<!cir.ptr<!s32i>> // CIR: %[[SIZE:.*]] = cir.const #cir.int<8> : !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_TO_ARR:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!s32i> // CIR: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i // CIR: cir.store{{.*}} %[[ONE]], %[[ALLOC_TO_ARR]] : !s32i, !cir.ptr<!s32i> @@ -838,7 +838,7 @@ namespace gh68198 { // CIR-LABEL: cir.{{.*}}@_ZN7gh681985foo26Ev() // CIR: %[[ARR_ALLOCA:.*]] = cir.alloca "arr9" align(8) init : !cir.ptr<!cir.ptr<!void>> // CIR: %[[SIZE:.*]] = cir.const #cir.int<16> : !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_TO_ARR:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!cir.array<!s32i x 2>> // CIR: %[[ELT0_0:.*]] = cir.cast array_to_ptrdecay %[[ALLOC_TO_ARR]] : !cir.ptr<!cir.array<!s32i x 2>> -> !cir.ptr<!s32i> // CIR: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i @@ -881,7 +881,7 @@ namespace gh68198 { // CIR-LABEL: cir.{{.*}}@_ZN7gh681985foo27Ev() // CIR: %[[ARR_ALLOCA:.*]] = cir.alloca "arr10" align(8) init : !cir.ptr<!cir.ptr<!void>> // CIR: %[[SIZE:.*]] = cir.const #cir.int<32> : !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_TO_ARR:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!cir.array<!s32i x 2>> // CIR: %[[ELT0_0:.*]] = cir.cast array_to_ptrdecay %[[ALLOC_TO_ARR]] : !cir.ptr<!cir.array<!s32i x 2>> -> !cir.ptr<!s32i> // CIR: %[[FIVE:.*]] = cir.const #cir.int<5> : !s32i diff --git a/clang/test/CIR/CodeGenBuiltins/builtin-new-delete.cpp b/clang/test/CIR/CodeGenBuiltins/builtin-new-delete.cpp index 3ddf165e767c2b..5ca1e6a0f5d9e0 100644 --- a/clang/test/CIR/CodeGenBuiltins/builtin-new-delete.cpp +++ b/clang/test/CIR/CodeGenBuiltins/builtin-new-delete.cpp @@ -9,12 +9,12 @@ void test_builtins_basic() { __builtin_operator_delete(__builtin_operator_new(4)); // CIR-LABEL: test_builtins_basic - // CIR: [[P:%.*]] = cir.call @_Znwm({{%.*}}) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: [[P:%.*]] = cir.call @_Znwm({{%.*}}) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: cir.call @_ZdlPv([[P]]) {{.*}}builtin{{.*}} : (!cir.ptr<!void> {llvm.noundef}) -> () // CIR: cir.return // LLVM-LABEL: test_builtins_basic - // LLVM: [[P:%.*]] = call noundef nonnull ptr @_Znwm(i64 {{.*}} 4) #[[ATTR_BUILTIN_NEW:.*]] + // LLVM: [[P:%.*]] = call noalias noundef nonnull ptr @_Znwm(i64 {{.*}} 4) #[[ATTR_BUILTIN_NEW:.*]] // LLVM: call void @_ZdlPv(ptr {{.*}} [[P]]) #[[ATTR_BUILTIN_DEL:.*]] // LLVM: ret void @@ -28,12 +28,12 @@ void test_sized_delete() { __builtin_operator_delete(__builtin_operator_new(4), 4); // CIR-LABEL: test_sized_delete - // CIR: [[P:%.*]] = cir.call @_Znwm({{%.*}}) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: [[P:%.*]] = cir.call @_Znwm({{%.*}}) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: cir.call @_ZdlPvm([[P]], {{%.*}}) {{.*}}builtin{{.*}} : (!cir.ptr<!void> {llvm.noundef}, !u64i {llvm.noundef}) -> () // CIR: cir.return // LLVM-LABEL: test_sized_delete - // LLVM: [[P:%.*]] = call noundef nonnull ptr @_Znwm(i64 {{.*}} 4) #[[ATTR_BUILTIN_NEW]] + // LLVM: [[P:%.*]] = call noalias noundef nonnull ptr @_Znwm(i64 {{.*}} 4) #[[ATTR_BUILTIN_NEW]] // LLVM: call void @_ZdlPvm(ptr {{.*}} [[P]], i64 {{.*}} 4) #[[ATTR_BUILTIN_DEL]] // LLVM: ret void @@ -43,7 +43,7 @@ void test_sized_delete() { // OGCG: ret void } -// LLVM-DAG: attributes #[[ATTR_BUILTIN_NEW]] = {{{.*}}builtin{{.*}}} +// LLVM-DAG: attributes #[[ATTR_BUILTIN_NEW]] = {{{.*}}builtin{{.*}}memory(inaccessiblemem: readwrite, errnomem: write){{.*}}} // LLVM-DAG: attributes #[[ATTR_BUILTIN_DEL]] = {{{.*}}builtin{{.*}}} // OGCG-DAG: attributes #[[OGCG_ATTR_BUILTIN_NEW]] = {{{.*}}builtin{{.*}}} // OGCG-DAG: attributes #[[OGCG_ATTR_BUILTIN_DEL]] = {{{.*}}builtin{{.*}}} diff --git a/clang/test/CIR/CodeGenCXX/new-array-init.cpp b/clang/test/CIR/CodeGenCXX/new-array-init.cpp index 783516c7148ec6..8fd9ffd8e2e115 100644 --- a/clang/test/CIR/CodeGenCXX/new-array-init.cpp +++ b/clang/test/CIR/CodeGenCXX/new-array-init.cpp @@ -27,7 +27,7 @@ void fn(int n) { // 64 bit all 1s // CIR: %[[ALL_ONES:.*]] = cir.const #cir.int<18446744073709551615> : !u64i // CIR: %[[ADJ_SIZE:.*]] = cir.select if %[[LT_THREE_OR_OVRFL]] then %[[ALL_ONES]] else %[[N_IN_BYTES]] : (!cir.bool, !u64i, !u64i) -> !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[ADJ_SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[ADJ_SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_TO_INTS:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!s32i> // CIR: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i // CIR: cir.store {{.*}}%[[ONE]], %[[ALLOC_TO_INTS]] : !s32i, !cir.ptr<!s32i> @@ -82,7 +82,7 @@ void fn_paren(int n) { // 64 bit all 1s // CIR: %[[ALL_ONES:.*]] = cir.const #cir.int<18446744073709551615> : !u64i // CIR: %[[ADJ_SIZE:.*]] = cir.select if %[[LT_THREE_OR_OVRFL]] then %[[ALL_ONES]] else %[[N_IN_BYTES]] : (!cir.bool, !u64i, !u64i) -> !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[ADJ_SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[ADJ_SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_TO_INTS:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!s32i> // CIR: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i // CIR: cir.store {{.*}}%[[ONE]], %[[ALLOC_TO_INTS]] : !s32i, !cir.ptr<!s32i> @@ -127,7 +127,7 @@ void fn_paren(int n) { // LLVM-LABEL: define{{.*}} void @_Z11const_exactv void const_exact() { // CIR: %[[ALLOC_SIZE:.*]] = cir.const #cir.int<12> : !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[ALLOC_SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[ALLOC_SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_TO_INTS:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!s32i> // CIR: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i // CIR: cir.store {{.*}}%[[ONE]], %[[ALLOC_TO_INTS]] : !s32i, !cir.ptr<!s32i> @@ -158,7 +158,7 @@ void const_exact() { // LLVM-LABEL: define{{.*}} void @_Z17const_exact_parenv void const_exact_paren() { // CIR: %[[SIZE:.*]] = cir.const #cir.int<12> : !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_CAST:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!s32i> // CIR: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i // CIR: cir.store {{.*}} %[[ONE]], %[[ALLOC_CAST]] : !s32i, !cir.ptr<!s32i> @@ -188,7 +188,7 @@ void const_exact_paren() { // LLVM-LABEL: define{{.*}} void @_Z16const_sufficientv void const_sufficient() { // CIR: %[[SIZE:.*]] = cir.const #cir.int<16> : !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_INTS:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!s32i> // CIR: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i // CIR: cir.store {{.*}} %[[ONE]], %[[ALLOC_INTS]] : !s32i, !cir.ptr<!s32i> @@ -225,7 +225,7 @@ void const_sufficient() { // LLVM-LABEL: define{{.*}} void @_Z22const_sufficient_parenv void const_sufficient_paren() { // CIR: %[[SIZE:.*]] = cir.const #cir.int<16> : !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_INTS:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!s32i> // CIR: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i // CIR: cir.store {{.*}} %[[ONE]], %[[ALLOC_INTS]] : !s32i, !cir.ptr<!s32i> @@ -287,7 +287,7 @@ void string_nonconst(int n) { // CIR: %[[N_LT_4:.*]] = cir.cmp lt %[[N_CAST]], %[[FOUR]] : !u64i // CIR: %[[NEG_ONE:.*]] = cir.const #cir.int<18446744073709551615> : !u64i // CIR: %[[SIZE:.*]] = cir.select if %[[N_LT_4]] then %[[NEG_ONE]] else %[[N_CAST]] : (!cir.bool, !u64i, !u64i) -> !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_CAST:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!s8i> // CIR: %[[ALLOC_AS_STRING:.*]] = cir.cast bitcast %[[ALLOC_CAST]] : !cir.ptr<!s8i> -> !cir.ptr<!cir.array<!s8i x 4>> // CIR: %[[GET_STR:.*]] = cir.get_global @[[ABC4]] : !cir.ptr<!cir.array<!s8i x 4>> @@ -323,7 +323,7 @@ void string_nonconst_paren(int n) { // CIR: %[[N_LT_4:.*]] = cir.cmp lt %[[N_CAST]], %[[FOUR]] : !u64i // CIR: %[[NEG_ONE:.*]] = cir.const #cir.int<18446744073709551615> : !u64i // CIR: %[[SIZE:.*]] = cir.select if %[[N_LT_4]] then %[[NEG_ONE]] else %[[N_CAST]] : (!cir.bool, !u64i, !u64i) -> !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_CAST:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!s8i> // CIR: %[[ALLOC_AS_STRING:.*]] = cir.cast bitcast %[[ALLOC_CAST]] : !cir.ptr<!s8i> -> !cir.ptr<!cir.array<!s8i x 4>> // CIR: %[[GET_STR:.*]] = cir.get_global @[[ABC4]] : !cir.ptr<!cir.array<!s8i x 4>> @@ -359,7 +359,7 @@ void string_nonconst_paren_extra_paren(int n) { // CIR: %[[N_LT_4:.*]] = cir.cmp lt %[[N_CAST]], %[[FOUR]] : !u64i // CIR: %[[NEG_ONE:.*]] = cir.const #cir.int<18446744073709551615> : !u64i // CIR: %[[SIZE:.*]] = cir.select if %[[N_LT_4]] then %[[NEG_ONE]] else %[[N_CAST]] : (!cir.bool, !u64i, !u64i) -> !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_CAST:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!s8i> // CIR: %[[ALLOC_AS_STRING:.*]] = cir.cast bitcast %[[ALLOC_CAST]] : !cir.ptr<!s8i> -> !cir.ptr<!cir.array<!s8i x 4>> // CIR: %[[GET_STR:.*]] = cir.get_global @[[ABC4]] : !cir.ptr<!cir.array<!s8i x 4>> @@ -389,7 +389,7 @@ void string_nonconst_paren_extra_paren(int n) { // LLVM-LABEL: define{{.*}} void @_Z12string_exactv void string_exact() { // CIR: %[[SIZE:.*]] = cir.const #cir.int<4> : !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_CAST:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!s8i> // CIR: %[[ALLOC_AS_STRING:.*]] = cir.cast bitcast %[[ALLOC_CAST]] : !cir.ptr<!s8i> -> !cir.ptr<!cir.array<!s8i x 4>> // CIR: %[[GET_STR:.*]] = cir.get_global @[[ABC4]] : !cir.ptr<!cir.array<!s8i x 4>> @@ -405,7 +405,7 @@ void string_exact() { // LLVM-LABEL: define{{.*}} void @_Z18string_exact_parenv void string_exact_paren() { // CIR: %[[SIZE:.*]] = cir.const #cir.int<4> : !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_CAST:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!s8i> // CIR: %[[ALLOC_AS_STRING:.*]] = cir.cast bitcast %[[ALLOC_CAST]] : !cir.ptr<!s8i> -> !cir.ptr<!cir.array<!s8i x 4>> // CIR: %[[GET_STR:.*]] = cir.get_global @[[ABC4]] : !cir.ptr<!cir.array<!s8i x 4>> @@ -421,7 +421,7 @@ void string_exact_paren() { // LLVM-LABEL: define{{.*}} void @_Z28string_exact_paren_extensionv void string_exact_paren_extension() { // CIR: %[[SIZE:.*]] = cir.const #cir.int<4> : !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_CAST:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!s8i> // CIR: %[[ALLOC_AS_STRING:.*]] = cir.cast bitcast %[[ALLOC_CAST]] : !cir.ptr<!s8i> -> !cir.ptr<!cir.array<!s8i x 4>> // CIR: %[[GET_STR:.*]] = cir.get_global @[[ABC4]] : !cir.ptr<!cir.array<!s8i x 4>> @@ -437,7 +437,7 @@ void string_exact_paren_extension() { // LLVM-LABEL: define{{.*}} void @_Z17string_sufficientv void string_sufficient() { // CIR: %[[SIZE:.*]] = cir.const #cir.int<15> : !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_CAST:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!s8i> // CIR: %[[ALLOC_AS_STRING:.*]] = cir.cast bitcast %[[ALLOC_CAST]] : !cir.ptr<!s8i> -> !cir.ptr<!cir.array<!s8i x 15>> // CIR: %[[GET_STR:.*]] = cir.get_global @[[ABC15]] : !cir.ptr<!cir.array<!s8i x 15>> @@ -453,7 +453,7 @@ void string_sufficient() { // LLVM-LABEL: define{{.*}} void @_Z23string_sufficient_parenv void string_sufficient_paren() { // CIR: %[[SIZE:.*]] = cir.const #cir.int<15> : !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_CAST:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!s8i> // CIR: %[[ALLOC_AS_STRING:.*]] = cir.cast bitcast %[[ALLOC_CAST]] : !cir.ptr<!s8i> -> !cir.ptr<!cir.array<!s8i x 15>> // CIR: %[[GET_STR:.*]] = cir.get_global @[[ABC15]] : !cir.ptr<!cir.array<!s8i x 15>> @@ -469,7 +469,7 @@ void string_sufficient_paren() { // LLVM-LABEL: define{{.*}} void @_Z10aggr_exactv void aggr_exact() { // CIR: %[[SIZE:.*]] = cir.const #cir.int<16> : !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_CAST:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!rec_Aggr> // CIR: %[[GET_A:.*]] = cir.get_member %[[ALLOC_CAST]][0] {name = "a"} : !cir.ptr<!rec_Aggr> -> !cir.ptr<!s32i> // CIR: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i @@ -518,7 +518,7 @@ void aggr_sufficient(int n) { // CIR: %[[N_LT_OR_OF:.*]] = cir.or %[[N_LT_2]], %[[MUL_OF]] : !cir.bool // CIR: %[[NEG_ONE:.*]] = cir.const #cir.int<18446744073709551615> : !u64i // CIR: %[[SIZE:.*]] = cir.select if %[[N_LT_OR_OF]] then %[[NEG_ONE]] else %[[N_BYTES]] : (!cir.bool, !u64i, !u64i) -> !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_CAST:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!rec_Aggr2E0> // CIR: %[[GET_A:.*]] = cir.get_member %[[ALLOC_CAST]][0] {name = "a"} : !cir.ptr<!rec_Aggr2E0> -> !cir.ptr<!s32i> // CIR: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i @@ -572,7 +572,7 @@ void aggr_sufficient(int n) { // LLVM-LABEL: define{{.*}} void @_Z14constexpr_testv void constexpr_test() { // CIR: %[[SIZE:.*]] = cir.const #cir.int<4> : !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_INTS:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!s32i> // CIR: %[[ZERO:.*]] = cir.const #cir.int<0> : !s32i // CIR: cir.store {{.*}} %[[ZERO]], %[[ALLOC_INTS]] : !s32i, !cir.ptr<!s32i> @@ -590,7 +590,7 @@ void constexpr_test() { // LLVM-LABEL: define{{.*}} void @_Z13unknown_boundv void unknown_bound() { // CIR: %[[SIZE:.*]] = cir.const #cir.int<24> : !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_AGG:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!rec_Aggr2E1> // CIR: %[[GET_X:.*]] = cir.get_member %[[ALLOC_AGG]][0] {name = "x"} : !cir.ptr<!rec_Aggr2E1> -> !cir.ptr<!s32i> // CIR: %[[ONE:.*]] = cir.const #cir.int<1> : !s32i @@ -638,7 +638,7 @@ void unknown_bound() { // LLVM-LABEL: define{{.*}} void @_Z20unknown_bound_stringv void unknown_bound_string() { // CIR: %[[SIZE:.*]] = cir.const #cir.int<6> : !u64i - // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) + // CIR: %[[ALLOC:.*]] = cir.call @_Znam(%[[SIZE]]) {allocsize = array<i32: 0>, builtin, memory_effects = #cir.memory_effects<other = none, arg_mem = none, inaccessible_mem = readwrite, errno_mem = write, target_mem0 = none, target_mem1 = none>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR: %[[ALLOC_CHAR:.*]] = cir.cast bitcast %[[ALLOC]] : !cir.ptr<!void> -> !cir.ptr<!s8i> // CIR: %[[ALLOC_STR:.*]] = cir.cast bitcast %[[ALLOC_CHAR]] : !cir.ptr<!s8i> -> !cir.ptr<!cir.array<!s8i x 6>> // CIR: %[[GET_HELLO:.*]] = cir.get_global @[[HELLO]] : !cir.ptr<!cir.array<!s8i x 6>> diff --git a/clang/test/CIR/CodeGenCoroutines/coro-task.cpp b/clang/test/CIR/CodeGenCoroutines/coro-task.cpp index 56360d852b0779..aa723165646893 100644 --- a/clang/test/CIR/CodeGenCoroutines/coro-task.cpp +++ b/clang/test/CIR/CodeGenCoroutines/coro-task.cpp @@ -54,7 +54,7 @@ VoidTask silly_task() { // CIR-NEXT: cir.store{{.*}} %[[NullPtr]], %[[SavedFrameAddr]] : !cir.ptr<!void>, !cir.ptr<!cir.ptr<!void>> // CIR-NEXT: cir.if %[[ShouldAlloc]] { // CIR-NEXT: %[[CoroSize:.*]] = cir.coro.intrinsic.size() : () -> !u64i -// CIR-NEXT: %[[AllocAddr:.*]] = cir.call @_Znwm(%[[CoroSize]]) {allocsize = array<i32: 0>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.nonnull, llvm.noundef}) +// CIR-NEXT: %[[AllocAddr:.*]] = cir.call @_Znwm(%[[CoroSize]]) {allocsize = array<i32: 0>} : (!u64i {llvm.noundef}) -> (!cir.ptr<!void> {llvm.noalias, llvm.nonnull, llvm.noundef}) // CIR-NEXT: cir.store{{.*}} %[[AllocAddr]], %[[SavedFrameAddr]] : !cir.ptr<!void>, !cir.ptr<!cir.ptr<!void>> // CIR-NEXT: } // CIR-NEXT: %[[Load0:.*]] = cir.load{{.*}} %[[SavedFrameAddr]] : !cir.ptr<!cir.ptr<!void>>, !cir.ptr<!void> _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
