llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Adam Smith (adams381) <details> <summary>Changes</summary> After #<!-- -->214742 (empty class) and #<!-- -->215117 (`_Complex` and other float formats), seventeen tests carried `-fno-clangir-call-conv-lowering` even though the pass refuses nothing in them. They compile clean with the flag gone. Their CHECK lines still described the un-lowered signature, so they failed on the coercion rather than on a missing feature. Update the expectations and drop the opt-out. Assisted by: Cursor / claude-opus-5 --- Patch is 130.02 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/218293.diff 17 Files Affected: - (modified) clang/test/CIR/CodeGen/cleanup-conditional.cpp (+285-316) - (modified) clang/test/CIR/CodeGen/cleanup-derived-to-base-ref.cpp (+3-5) - (modified) clang/test/CIR/CodeGen/cleanup.cpp (+9-5) - (modified) clang/test/CIR/CodeGen/complex-cast.cpp (+6-7) - (modified) clang/test/CIR/CodeGen/complex.cpp (+148-45) - (modified) clang/test/CIR/CodeGen/cxx-rewritten-binary-operator.cpp (+28-19) - (modified) clang/test/CIR/CodeGen/delete-destroying.cpp (+6-11) - (modified) clang/test/CIR/CodeGen/dtors.cpp (+5-9) - (modified) clang/test/CIR/CodeGen/loop-cond-cleanup.cpp (+15-17) - (modified) clang/test/CIR/CodeGen/loop-cond-var-cleanup.cpp (+15-19) - (modified) clang/test/CIR/CodeGen/new-null.cpp (+8-16) - (modified) clang/test/CIR/CodeGen/nofpclass.c (+3-5) - (modified) clang/test/CIR/CodeGen/nrvo.cpp (+28-22) - (modified) clang/test/CIR/CodeGen/pack-indexing.cpp (+29-14) - (modified) clang/test/CIR/CodeGen/three-way-cmp.cpp (+101-46) - (modified) clang/test/CIR/CodeGen/var-arg-aggregate.c (+10-6) - (modified) clang/test/CIR/CodeGenSYCL/kernel-call-stmt.cpp (+3-9) ``````````diff diff --git a/clang/test/CIR/CodeGen/cleanup-conditional.cpp b/clang/test/CIR/CodeGen/cleanup-conditional.cpp index 4a75dbed1925d..8516949b442be 100644 --- a/clang/test/CIR/CodeGen/cleanup-conditional.cpp +++ b/clang/test/CIR/CodeGen/cleanup-conditional.cpp @@ -1,11 +1,9 @@ -// TODO(cir): drop -fno-clangir-call-conv-lowering once CallConvLowering -// supports _Complex types. -// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -fno-clangir-call-conv-lowering -emit-cir %s -o %t.cir +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir // RUN: FileCheck --input-file=%t.cir %s --check-prefix=CIR -// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -fno-clangir-call-conv-lowering -emit-llvm %s -o %t-cir.ll -// RUN: FileCheck --input-file=%t-cir.ll %s --check-prefix=LLVM +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t-cir.ll +// RUN: FileCheck --input-file=%t-cir.ll %s --check-prefixes=LLVM,LLVMCIR // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o %t.ll -// RUN: FileCheck --input-file=%t.ll %s --check-prefix=OGCG +// RUN: FileCheck --input-file=%t.ll %s --check-prefixes=LLVM,OGCG struct S { S(); @@ -43,42 +41,42 @@ void test_ternary_temporary(bool c, int x) { // CIR: cir.yield // CIR: } -// LLVM-LABEL: define dso_local void @_Z22test_ternary_temporarybi( -// LLVM: %[[TMP:.*]] = alloca %struct.S -// LLVM: %[[ACTIVE:.*]] = alloca i8 -// LLVM: %[[RESULT_TMP:.*]] = alloca i32 -// LLVM: br label %[[INIT:.*]] -// LLVM: [[INIT]]: -// LLVM: %[[COND_BYTE:.*]] = load i8, ptr %{{.*}} -// LLVM: %[[COND_BOOL:.*]] = trunc i8 %[[COND_BYTE]] to i1 -// LLVM: store i8 0, ptr %[[ACTIVE]] -// LLVM: br i1 %[[COND_BOOL]], label %[[TRUE_BR:.*]], label %[[FALSE_BR:.*]] -// LLVM: [[TRUE_BR]]: -// LLVM: call void @_ZN1SC1Ev(ptr {{.*}} %[[TMP]]) -// LLVM: store i8 1, ptr %[[ACTIVE]] -// LLVM: %[[GET_RESULT:.*]] = call {{.*}} i32 @_ZN1S3getEv(ptr {{.*}} %[[TMP]]) -// LLVM: br label %[[MERGE:.*]] -// LLVM: [[FALSE_BR]]: -// LLVM: %[[XVAL:.*]] = load i32, ptr %{{.*}} -// LLVM: br label %[[MERGE]] -// LLVM: [[MERGE]]: -// LLVM: %[[PHI:.*]] = phi i32 [ %[[XVAL]], %[[FALSE_BR]] ], [ %[[GET_RESULT]], %[[TRUE_BR]] ] -// LLVM: br label %[[STORE:.*]] -// LLVM: [[STORE]]: -// LLVM: store i32 %[[PHI]], ptr %[[RESULT_TMP]] -// LLVM: br label %[[CLEANUP:.*]] -// LLVM: [[CLEANUP]]: -// LLVM: %[[ACTIVE_BYTE:.*]] = load i8, ptr %[[ACTIVE]] -// LLVM: %[[ACTIVE_BOOL:.*]] = trunc i8 %[[ACTIVE_BYTE]] to i1 -// LLVM: br i1 %[[ACTIVE_BOOL]], label %[[DTOR:.*]], label %[[SKIP_DTOR:.*]] -// LLVM: [[DTOR]]: -// LLVM: call void @_ZN1SD1Ev(ptr {{.*}} %[[TMP]]) -// LLVM: br label %[[SKIP_DTOR]] -// LLVM: [[SKIP_DTOR]]: -// LLVM: br label %[[EXIT:.*]] -// LLVM: [[EXIT]]: -// LLVM: %[[RESULT:.*]] = load i32, ptr %[[RESULT_TMP]] -// LLVM: store i32 %[[RESULT]], ptr %{{.*}} +// LLVMCIR-LABEL: define dso_local void @_Z22test_ternary_temporarybi( +// LLVMCIR: %[[TMP:.*]] = alloca %struct.S +// LLVMCIR: %[[ACTIVE:.*]] = alloca i8 +// LLVMCIR: %[[RESULT_TMP:.*]] = alloca i32 +// LLVMCIR: br label %[[INIT:.*]] +// LLVMCIR: [[INIT]]: +// LLVMCIR: %[[COND_BYTE:.*]] = load i8, ptr %{{.*}} +// LLVMCIR: %[[COND_BOOL:.*]] = trunc i8 %[[COND_BYTE]] to i1 +// LLVMCIR: store i8 0, ptr %[[ACTIVE]] +// LLVMCIR: br i1 %[[COND_BOOL]], label %[[TRUE_BR:.*]], label %[[FALSE_BR:.*]] +// LLVMCIR: [[TRUE_BR]]: +// LLVMCIR: call void @_ZN1SC1Ev(ptr {{.*}} %[[TMP]]) +// LLVMCIR: store i8 1, ptr %[[ACTIVE]] +// LLVMCIR: %[[GET_RESULT:.*]] = call {{.*}} i32 @_ZN1S3getEv(ptr {{.*}} %[[TMP]]) +// LLVMCIR: br label %[[MERGE:.*]] +// LLVMCIR: [[FALSE_BR]]: +// LLVMCIR: %[[XVAL:.*]] = load i32, ptr %{{.*}} +// LLVMCIR: br label %[[MERGE]] +// LLVMCIR: [[MERGE]]: +// LLVMCIR: %[[PHI:.*]] = phi i32 [ %[[XVAL]], %[[FALSE_BR]] ], [ %[[GET_RESULT]], %[[TRUE_BR]] ] +// LLVMCIR: br label %[[STORE:.*]] +// LLVMCIR: [[STORE]]: +// LLVMCIR: store i32 %[[PHI]], ptr %[[RESULT_TMP]] +// LLVMCIR: br label %[[CLEANUP:.*]] +// LLVMCIR: [[CLEANUP]]: +// LLVMCIR: %[[ACTIVE_BYTE:.*]] = load i8, ptr %[[ACTIVE]] +// LLVMCIR: %[[ACTIVE_BOOL:.*]] = trunc i8 %[[ACTIVE_BYTE]] to i1 +// LLVMCIR: br i1 %[[ACTIVE_BOOL]], label %[[DTOR:.*]], label %[[SKIP_DTOR:.*]] +// LLVMCIR: [[DTOR]]: +// LLVMCIR: call void @_ZN1SD1Ev(ptr {{.*}} %[[TMP]]) +// LLVMCIR: br label %[[SKIP_DTOR]] +// LLVMCIR: [[SKIP_DTOR]]: +// LLVMCIR: br label %[[EXIT:.*]] +// LLVMCIR: [[EXIT]]: +// LLVMCIR: %[[RESULT:.*]] = load i32, ptr %[[RESULT_TMP]] +// LLVMCIR: store i32 %[[RESULT]], ptr %{{.*}} // OGCG-LABEL: define dso_local void @_Z22test_ternary_temporarybi( // OGCG: entry: @@ -155,53 +153,53 @@ void test_ternary_both_branches(bool c) { // CIR: cir.yield // CIR: } -// LLVM-LABEL: define dso_local void @_Z26test_ternary_both_branchesb( -// LLVM: %{{.*}} = alloca i8 -// LLVM: %{{.*}} = alloca i32 -// LLVM: %[[TMPA:.*]] = alloca %struct.A -// LLVM: %[[ACTA:.*]] = alloca i8 -// LLVM: %[[TMPB:.*]] = alloca %struct.B -// LLVM: %[[ACTB:.*]] = alloca i8 -// LLVM: %[[RESULT_TMP:.*]] = alloca i32 -// LLVM: br label %[[INIT:.*]] -// LLVM: [[INIT]]: -// LLVM: %[[COND_BYTE:.*]] = load i8, ptr %{{.*}} -// LLVM: %[[COND_BOOL:.*]] = trunc i8 %[[COND_BYTE]] to i1 -// LLVM: store i8 0, ptr %[[ACTA]] -// LLVM: store i8 0, ptr %[[ACTB]] -// LLVM: br i1 %[[COND_BOOL]], label %[[CONSTRUCT_A:.*]], label %[[CONSTRUCT_B:.*]] -// LLVM: [[CONSTRUCT_A]]: -// LLVM: call void @_ZN1AC1Ev({{.*}} %[[TMPA]]) -// LLVM: store i8 1, ptr %[[ACTA]] -// LLVM: %[[CALLA:.*]] = call noundef i32 @_ZN1A3getEv({{.*}} %[[TMPA]]) -// LLVM: br label %[[MERGE:.*]] -// LLVM: [[CONSTRUCT_B]]: -// LLVM: call void @_ZN1BC1Ev({{.*}} %[[TMPB]]) -// LLVM: store i8 1, ptr %[[ACTB]] -// LLVM: %[[CALLB:.*]] = call {{.*}} i32 @_ZN1B3getEv({{.*}} %[[TMPB]]) -// LLVM: br label %[[MERGE]] -// LLVM: [[MERGE]]: -// LLVM: %[[PHI:.*]] = phi i32 [ %[[CALLB]], %[[CONSTRUCT_B]] ], [ %[[CALLA]], %[[CONSTRUCT_A]] ] -// LLVM: br label %[[STORE:.*]] -// LLVM: [[STORE]]: -// LLVM: store i32 %[[PHI]], ptr %[[RESULT_TMP]] -// LLVM: br label %[[CLEANUP_B:.*]] -// LLVM: [[CLEANUP_B]]: -// LLVM: %[[ACTIVE_BYTE_B:.*]] = load i8, ptr %[[ACTB]] -// LLVM: %[[ACTIVE_BOOL_B:.*]] = trunc i8 %[[ACTIVE_BYTE_B]] to i1 -// LLVM: br i1 %[[ACTIVE_BOOL_B]], label %[[DTOR_B:.*]], label %[[SKIP_DTOR_B:.*]] -// LLVM: [[DTOR_B]]: -// LLVM: call void @_ZN1BD1Ev({{.*}} %[[TMPB]]) -// LLVM: br label %[[SKIP_DTOR_B]] -// LLVM: [[SKIP_DTOR_B]]: -// LLVM: %[[ACTIVE_BYTE_A:.*]] = load i8, ptr %[[ACTA]] -// LLVM: %[[ACTIVE_BOOL_A:.*]] = trunc i8 %[[ACTIVE_BYTE_A]] to i1 -// LLVM: br i1 %[[ACTIVE_BOOL_A]], label %[[DTOR_A:.*]], label %[[SKIP_DTOR_A:.*]] -// LLVM: [[DTOR_A]]: -// LLVM: call void @_ZN1AD1Ev({{.*}} %[[TMPA]]) -// LLVM: br label %[[SKIP_DTOR_A]] -// LLVM: [[SKIP_DTOR_A]]: -// LLVM: br label %{{.*}} +// LLVMCIR-LABEL: define dso_local void @_Z26test_ternary_both_branchesb( +// LLVMCIR: %{{.*}} = alloca i8 +// LLVMCIR: %{{.*}} = alloca i32 +// LLVMCIR: %[[TMPA:.*]] = alloca %struct.A +// LLVMCIR: %[[ACTA:.*]] = alloca i8 +// LLVMCIR: %[[TMPB:.*]] = alloca %struct.B +// LLVMCIR: %[[ACTB:.*]] = alloca i8 +// LLVMCIR: %[[RESULT_TMP:.*]] = alloca i32 +// LLVMCIR: br label %[[INIT:.*]] +// LLVMCIR: [[INIT]]: +// LLVMCIR: %[[COND_BYTE:.*]] = load i8, ptr %{{.*}} +// LLVMCIR: %[[COND_BOOL:.*]] = trunc i8 %[[COND_BYTE]] to i1 +// LLVMCIR: store i8 0, ptr %[[ACTA]] +// LLVMCIR: store i8 0, ptr %[[ACTB]] +// LLVMCIR: br i1 %[[COND_BOOL]], label %[[CONSTRUCT_A:.*]], label %[[CONSTRUCT_B:.*]] +// LLVMCIR: [[CONSTRUCT_A]]: +// LLVMCIR: call void @_ZN1AC1Ev({{.*}} %[[TMPA]]) +// LLVMCIR: store i8 1, ptr %[[ACTA]] +// LLVMCIR: %[[CALLA:.*]] = call noundef i32 @_ZN1A3getEv({{.*}} %[[TMPA]]) +// LLVMCIR: br label %[[MERGE:.*]] +// LLVMCIR: [[CONSTRUCT_B]]: +// LLVMCIR: call void @_ZN1BC1Ev({{.*}} %[[TMPB]]) +// LLVMCIR: store i8 1, ptr %[[ACTB]] +// LLVMCIR: %[[CALLB:.*]] = call {{.*}} i32 @_ZN1B3getEv({{.*}} %[[TMPB]]) +// LLVMCIR: br label %[[MERGE]] +// LLVMCIR: [[MERGE]]: +// LLVMCIR: %[[PHI:.*]] = phi i32 [ %[[CALLB]], %[[CONSTRUCT_B]] ], [ %[[CALLA]], %[[CONSTRUCT_A]] ] +// LLVMCIR: br label %[[STORE:.*]] +// LLVMCIR: [[STORE]]: +// LLVMCIR: store i32 %[[PHI]], ptr %[[RESULT_TMP]] +// LLVMCIR: br label %[[CLEANUP_B:.*]] +// LLVMCIR: [[CLEANUP_B]]: +// LLVMCIR: %[[ACTIVE_BYTE_B:.*]] = load i8, ptr %[[ACTB]] +// LLVMCIR: %[[ACTIVE_BOOL_B:.*]] = trunc i8 %[[ACTIVE_BYTE_B]] to i1 +// LLVMCIR: br i1 %[[ACTIVE_BOOL_B]], label %[[DTOR_B:.*]], label %[[SKIP_DTOR_B:.*]] +// LLVMCIR: [[DTOR_B]]: +// LLVMCIR: call void @_ZN1BD1Ev({{.*}} %[[TMPB]]) +// LLVMCIR: br label %[[SKIP_DTOR_B]] +// LLVMCIR: [[SKIP_DTOR_B]]: +// LLVMCIR: %[[ACTIVE_BYTE_A:.*]] = load i8, ptr %[[ACTA]] +// LLVMCIR: %[[ACTIVE_BOOL_A:.*]] = trunc i8 %[[ACTIVE_BYTE_A]] to i1 +// LLVMCIR: br i1 %[[ACTIVE_BOOL_A]], label %[[DTOR_A:.*]], label %[[SKIP_DTOR_A:.*]] +// LLVMCIR: [[DTOR_A]]: +// LLVMCIR: call void @_ZN1AD1Ev({{.*}} %[[TMPA]]) +// LLVMCIR: br label %[[SKIP_DTOR_A]] +// LLVMCIR: [[SKIP_DTOR_A]]: +// LLVMCIR: br label %{{.*}} // OGCG-LABEL: define dso_local void @_Z26test_ternary_both_branchesb( // OGCG: entry: @@ -277,55 +275,55 @@ int test_return_ternary(bool c) { // CIR: %[[RET:.*]] = cir.load %{{.*}} : !cir.ptr<!s32i>, !s32i // CIR: cir.return %[[RET]] : !s32i -// LLVM-LABEL: define dso_local noundef i32 @_Z19test_return_ternaryb( -// LLVM: %{{.*}} = alloca i8 -// LLVM: %[[RETVAL:.*]] = alloca i32 -// LLVM: %[[TMPA:.*]] = alloca %struct.A -// LLVM: %[[ACTA:.*]] = alloca i8 -// LLVM: %[[TMPB:.*]] = alloca %struct.B -// LLVM: %[[ACTB:.*]] = alloca i8 -// LLVM: br label %[[INIT:.*]] -// LLVM: [[INIT]]: -// LLVM: %[[COND_BYTE:.*]] = load i8, ptr %{{.*}} -// LLVM: %[[COND_BOOL:.*]] = trunc i8 %[[COND_BYTE]] to i1 -// LLVM: store i8 0, ptr %[[ACTA]] -// LLVM: store i8 0, ptr %[[ACTB]] -// LLVM: br i1 %[[COND_BOOL]], label %[[CONSTRUCT_A:.*]], label %[[CONSTRUCT_B:.*]] -// LLVM: [[CONSTRUCT_A]]: -// LLVM: call void @_ZN1AC1Ev({{.*}} %[[TMPA]]) -// LLVM: store i8 1, ptr %[[ACTA]] -// LLVM: %[[CALLA:.*]] = call noundef i32 @_ZN1A3getEv({{.*}} %[[TMPA]]) -// LLVM: br label %[[MERGE:.*]] -// LLVM: [[CONSTRUCT_B]]: -// LLVM: call void @_ZN1BC1Ev({{.*}} %[[TMPB]]) -// LLVM: store i8 1, ptr %[[ACTB]] -// LLVM: %[[CALLB:.*]] = call noundef i32 @_ZN1B3getEv({{.*}} %[[TMPB]]) -// LLVM: br label %[[MERGE]] -// LLVM: [[MERGE]]: -// LLVM: %[[PHI:.*]] = phi i32 [ %[[CALLB]], %[[CONSTRUCT_B]] ], [ %[[CALLA]], %[[CONSTRUCT_A]] ] -// LLVM: br label %[[STORE_RET:.*]] -// LLVM: [[STORE_RET]]: -// LLVM: store i32 %[[PHI]], ptr %[[RETVAL]] -// LLVM: br label %[[CLEANUP_B:.*]] -// LLVM: [[CLEANUP_B]]: -// LLVM: %[[ACTIVE_BYTE_B:.*]] = load i8, ptr %[[ACTB]] -// LLVM: %[[ACTIVE_BOOL_B:.*]] = trunc i8 %[[ACTIVE_BYTE_B]] to i1 -// LLVM: br i1 %[[ACTIVE_BOOL_B]], label %[[DTOR_B:.*]], label %[[SKIP_DTOR_B:.*]] -// LLVM: [[DTOR_B]]: -// LLVM: call void @_ZN1BD1Ev({{.*}} %[[TMPB]]) -// LLVM: br label %[[SKIP_DTOR_B]] -// LLVM: [[SKIP_DTOR_B]]: -// LLVM: %[[ACTIVE_BYTE_A:.*]] = load i8, ptr %[[ACTA]] -// LLVM: %[[ACTIVE_BOOL_A:.*]] = trunc i8 %[[ACTIVE_BYTE_A]] to i1 -// LLVM: br i1 %[[ACTIVE_BOOL_A]], label %[[DTOR_A:.*]], label %[[SKIP_DTOR_A:.*]] -// LLVM: [[DTOR_A]]: -// LLVM: call void @_ZN1AD1Ev({{.*}} %[[TMPA]]) -// LLVM: br label %[[SKIP_DTOR_A]] -// LLVM: [[SKIP_DTOR_A]]: -// LLVM: br label %[[EXIT:.*]] -// LLVM: [[EXIT]]: -// LLVM: %[[RET:.*]] = load i32, ptr %[[RETVAL]] -// LLVM: ret i32 %[[RET]] +// LLVMCIR-LABEL: define dso_local noundef i32 @_Z19test_return_ternaryb( +// LLVMCIR: %{{.*}} = alloca i8 +// LLVMCIR: %[[RETVAL:.*]] = alloca i32 +// LLVMCIR: %[[TMPA:.*]] = alloca %struct.A +// LLVMCIR: %[[ACTA:.*]] = alloca i8 +// LLVMCIR: %[[TMPB:.*]] = alloca %struct.B +// LLVMCIR: %[[ACTB:.*]] = alloca i8 +// LLVMCIR: br label %[[INIT:.*]] +// LLVMCIR: [[INIT]]: +// LLVMCIR: %[[COND_BYTE:.*]] = load i8, ptr %{{.*}} +// LLVMCIR: %[[COND_BOOL:.*]] = trunc i8 %[[COND_BYTE]] to i1 +// LLVMCIR: store i8 0, ptr %[[ACTA]] +// LLVMCIR: store i8 0, ptr %[[ACTB]] +// LLVMCIR: br i1 %[[COND_BOOL]], label %[[CONSTRUCT_A:.*]], label %[[CONSTRUCT_B:.*]] +// LLVMCIR: [[CONSTRUCT_A]]: +// LLVMCIR: call void @_ZN1AC1Ev({{.*}} %[[TMPA]]) +// LLVMCIR: store i8 1, ptr %[[ACTA]] +// LLVMCIR: %[[CALLA:.*]] = call noundef i32 @_ZN1A3getEv({{.*}} %[[TMPA]]) +// LLVMCIR: br label %[[MERGE:.*]] +// LLVMCIR: [[CONSTRUCT_B]]: +// LLVMCIR: call void @_ZN1BC1Ev({{.*}} %[[TMPB]]) +// LLVMCIR: store i8 1, ptr %[[ACTB]] +// LLVMCIR: %[[CALLB:.*]] = call noundef i32 @_ZN1B3getEv({{.*}} %[[TMPB]]) +// LLVMCIR: br label %[[MERGE]] +// LLVMCIR: [[MERGE]]: +// LLVMCIR: %[[PHI:.*]] = phi i32 [ %[[CALLB]], %[[CONSTRUCT_B]] ], [ %[[CALLA]], %[[CONSTRUCT_A]] ] +// LLVMCIR: br label %[[STORE_RET:.*]] +// LLVMCIR: [[STORE_RET]]: +// LLVMCIR: store i32 %[[PHI]], ptr %[[RETVAL]] +// LLVMCIR: br label %[[CLEANUP_B:.*]] +// LLVMCIR: [[CLEANUP_B]]: +// LLVMCIR: %[[ACTIVE_BYTE_B:.*]] = load i8, ptr %[[ACTB]] +// LLVMCIR: %[[ACTIVE_BOOL_B:.*]] = trunc i8 %[[ACTIVE_BYTE_B]] to i1 +// LLVMCIR: br i1 %[[ACTIVE_BOOL_B]], label %[[DTOR_B:.*]], label %[[SKIP_DTOR_B:.*]] +// LLVMCIR: [[DTOR_B]]: +// LLVMCIR: call void @_ZN1BD1Ev({{.*}} %[[TMPB]]) +// LLVMCIR: br label %[[SKIP_DTOR_B]] +// LLVMCIR: [[SKIP_DTOR_B]]: +// LLVMCIR: %[[ACTIVE_BYTE_A:.*]] = load i8, ptr %[[ACTA]] +// LLVMCIR: %[[ACTIVE_BOOL_A:.*]] = trunc i8 %[[ACTIVE_BYTE_A]] to i1 +// LLVMCIR: br i1 %[[ACTIVE_BOOL_A]], label %[[DTOR_A:.*]], label %[[SKIP_DTOR_A:.*]] +// LLVMCIR: [[DTOR_A]]: +// LLVMCIR: call void @_ZN1AD1Ev({{.*}} %[[TMPA]]) +// LLVMCIR: br label %[[SKIP_DTOR_A]] +// LLVMCIR: [[SKIP_DTOR_A]]: +// LLVMCIR: br label %[[EXIT:.*]] +// LLVMCIR: [[EXIT]]: +// LLVMCIR: %[[RET:.*]] = load i32, ptr %[[RETVAL]] +// LLVMCIR: ret i32 %[[RET]] // OGCG-LABEL: define dso_local noundef i32 @_Z19test_return_ternaryb( // OGCG: entry: @@ -386,23 +384,23 @@ int test_false_positive_conditional(bool c) { // CIR: cir.yield // CIR: } -// LLVM-LABEL: define dso_local noundef i32 @_Z31test_false_positive_conditionalb( -// LLVM: %[[RETVAL:.*]] = alloca i32 -// LLVM: %[[TMP:.*]] = alloca %struct.S -// LLVM: call void @_ZN1SC1Ev({{.*}} %[[TMP]]) -// LLVM: br label %[[BODY:.*]] -// LLVM: [[BODY]]: -// LLVM: %[[VAL:.*]] = call {{.*}} i32 @_ZN1S3getEv({{.*}} %[[TMP]]) -// LLVM: %[[CMP:.*]] = icmp ne i32 %[[VAL]], 0 -// LLVM: %[[SEL:.*]] = select i1 %[[CMP]], i32 1, i32 2 -// LLVM: store i32 %[[SEL]], ptr %[[RETVAL]] -// LLVM: br label %[[DTOR:.*]] -// LLVM: [[DTOR]]: -// LLVM: call void @_ZN1SD1Ev({{.*}} %[[TMP]]) -// LLVM: br label %[[EXIT:.*]] -// LLVM: [[EXIT]]: -// LLVM: %[[RET:.*]] = load i32, ptr %[[RETVAL]] -// LLVM: ret i32 %[[RET]] +// LLVMCIR-LABEL: define dso_local noundef i32 @_Z31test_false_positive_conditionalb( +// LLVMCIR: %[[RETVAL:.*]] = alloca i32 +// LLVMCIR: %[[TMP:.*]] = alloca %struct.S +// LLVMCIR: call void @_ZN1SC1Ev({{.*}} %[[TMP]]) +// LLVMCIR: br label %[[BODY:.*]] +// LLVMCIR: [[BODY]]: +// LLVMCIR: %[[VAL:.*]] = call {{.*}} i32 @_ZN1S3getEv({{.*}} %[[TMP]]) +// LLVMCIR: %[[CMP:.*]] = icmp ne i32 %[[VAL]], 0 +// LLVMCIR: %[[SEL:.*]] = select i1 %[[CMP]], i32 1, i32 2 +// LLVMCIR: store i32 %[[SEL]], ptr %[[RETVAL]] +// LLVMCIR: br label %[[DTOR:.*]] +// LLVMCIR: [[DTOR]]: +// LLVMCIR: call void @_ZN1SD1Ev({{.*}} %[[TMP]]) +// LLVMCIR: br label %[[EXIT:.*]] +// LLVMCIR: [[EXIT]]: +// LLVMCIR: %[[RET:.*]] = load i32, ptr %[[RETVAL]] +// LLVMCIR: ret i32 %[[RET]] // OGCG-LABEL: define dso_local noundef i32 @_Z31test_false_positive_conditionalb( // OGCG: call void @_ZN1SC1Ev({{.*}} %[[TMP:.*]]) @@ -523,40 +521,6 @@ void test_nested_ewc(bool c1, bool c2) { // LLVM: call void @_ZN1TD1Ev({{.*}} %[[REF_TMP]]) // LLVM: call void @_ZN1TD1Ev({{.*}} %[[RESULT]]) -// OGCG-LABEL: define dso_local void @_Z15test_nested_ewcbb( -// Inner ternary: c1 ? T(1) : T(2). -// OGCG: br i1 %{{.*}}, label %[[T1:.*]], label %[[T2:.*]] -// OGCG: [[T1]]: -// OGCG: call void @_ZN1TC1Ei({{.*}} %[[S:.*]], i32 {{.*}} 1) -// OGCG: br label %[[INNER_MERGE:.*]] -// OGCG: [[T2]]: -// OGCG: call void @_ZN1TC1Ei({{.*}} %[[S]], i32 {{.*}} 2) -// OGCG: br label %[[INNER_MERGE]] -// Copy construct ref.tmp from s, then destroy s. -// OGCG: [[INNER_MERGE]]: -// OGCG: call void @_ZN1TC1ERKS_({{.*}} %[[REF_TMP:.*]], {{.*}} %[[S]]) -// OGCG: call void @_ZN1TD1Ev({{.*}} %[[S]]) -// Outer ternary: operator bool() + conditional construction of result. -// OGCG: %[[BOOL:.*]] = call {{.*}} i1 @_ZN1TcvbEv({{.*}} %[[REF_TMP]]) -// OGCG: br i1 %[[BOOL]], label %[[TRUE:.*]], label %[[FALSE:.*]] -// OGCG: [[TRUE]]: -// OGCG: br i1 %{{.*}}, label %[[T3:.*]], label %[[T4:.*]] -// OGCG: [[T3]]: -// OGCG: call void @_ZN1TC1Ei({{.*}} %[[RESULT:.*]], i32 {{.*}} 3) -// OGCG: br label %[[OUTER_MERGE1:.*]] -// OGCG: [[T4]]: -// OGCG: call void @_ZN1TC1Ei({{.*}} %[[RESULT]], i32 {{.*}} 4) -// OGCG: br label %[[OUTER_MERGE1]] -// OGCG: [[OUTER_MERGE1]]: -// OGCG: br label %[[OUTER_MERGE2:.*]] -// OGCG: [[FALSE]]: -// OGCG: call void @_ZN1TC1Ei({{.*}} %[[RESULT]], i32 {{.*}} 5) -// OGCG: br label %[[OUTER_MERGE2]] -// Cleanup: destroy ref.tmp, then result. -// OGCG: [[OUTER_MERGE2]]: -// OGCG: call void @_ZN1TD1Ev({{.*}} %[[REF_TMP]]) -// OGCG: call void @_ZN1TD1Ev({{.*}} %[[RESULT]]) - // The result of the ternary is bound to an lvalue (the parameter of // operator=), so the enclosing ExprWithCleanups is lowered through the // LValue emission path. The lvalue path must still open a @@ -620,41 +584,41 @@ void test_lvalue_ternary_cleanup(bool c, V &y) { // CIR: cir.yield // CIR: } -// LLVM-LABEL: define dso_local void @_Z27test_lvalue_ternary_cleanupbR1V( -// LLVM: %[[REFTMP:.*]] = alloca %struct.V -// LLVM: %[[UTRUE:.*]] = alloca %struct.U -// LLVM: %[[ACTTRUE:.*]] = alloca i8 -// LLVM: %[[UFALSE:.*]] = alloca %struct.U -// LLVM: %[[ACTFALSE:.*]] = alloca i8 -// LLVM: store i8 0, ptr %[[ACTTRUE]] -// LLVM: store i8 0, ptr %[[ACTFALSE]] -// LLVM: br i1 %{{.*}}, label %[[CONS_TRUE:.*]], label %[[CONS_FALSE:.*]] ... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/218293 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
