Author: Roman Lebedev
Date: 2022-11-13T02:39:52+03:00
New Revision: 6daa005b90c8122751d04c6eba0fa1259e912cfe

URL: 
https://github.com/llvm/llvm-project/commit/6daa005b90c8122751d04c6eba0fa1259e912cfe
DIFF: 
https://github.com/llvm/llvm-project/commit/6daa005b90c8122751d04c6eba0fa1259e912cfe.diff

LOG: [NFC][Clang] Add some codegen tests for 
https://github.com/llvm/llvm-project/issues/58798

Added: 
    clang/test/CodeGenCXX/pr58798.cpp

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/clang/test/CodeGenCXX/pr58798.cpp 
b/clang/test/CodeGenCXX/pr58798.cpp
new file mode 100644
index 0000000000000..607b36aa7f69a
--- /dev/null
+++ b/clang/test/CodeGenCXX/pr58798.cpp
@@ -0,0 +1,186 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py 
UTC_ARGS: --function-signature --check-attributes
+// RUN: %clang_cc1 -emit-llvm %s -o - -triple x86_64-linux-gnu -fexceptions 
-fcxx-exceptions | FileCheck %s
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone willreturn 
memory(read)
+// CHECK-LABEL: define 
{{[^@]+}}@_Z54early_caller_of_callee_with_clang_attr_with_clang_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR0:[0-9]+]] {
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[CALL:%.*]] = call noundef i32 
@_Z22callee_with_clang_attri(i32 noundef [[TMP0]]) #[[ATTR3:[0-9]+]]
+// CHECK-NEXT:    ret i32 [[CALL]]
+//
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone willreturn 
memory(read)
+// CHECK-LABEL: define {{[^@]+}}@_Z22callee_with_clang_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR0]] {
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP0]], 0
+// CHECK-NEXT:    br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
+// CHECK:       if.then:
+// CHECK-NEXT:    [[EXCEPTION:%.*]] = call ptr @__cxa_allocate_exception(i64 
4) #[[ATTR4:[0-9]+]]
+// CHECK-NEXT:    store i32 42, ptr [[EXCEPTION]], align 16
+// CHECK-NEXT:    call void @__cxa_throw(ptr [[EXCEPTION]], ptr @_ZTIi, ptr 
null) #[[ATTR5:[0-9]+]]
+// CHECK-NEXT:    unreachable
+// CHECK:       if.end:
+// CHECK-NEXT:    ret i32 24
+//
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone
+// CHECK-LABEL: define 
{{[^@]+}}@_Z52early_caller_of_callee_with_clang_attr_with_cxx_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR1:[0-9]+]] {
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[CALL:%.*]] = call noundef i32 
@_Z22callee_with_clang_attri(i32 noundef [[TMP0]]) #[[ATTR3]]
+// CHECK-NEXT:    ret i32 [[CALL]]
+//
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone willreturn 
memory(read)
+// CHECK-LABEL: define 
{{[^@]+}}@_Z52early_caller_of_callee_with_cxx_attr_with_clang_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR0]] {
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[CALL:%.*]] = call noundef i32 
@_Z20callee_with_cxx_attri(i32 noundef [[TMP0]]) #[[ATTR4]]
+// CHECK-NEXT:    ret i32 [[CALL]]
+//
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone
+// CHECK-LABEL: define {{[^@]+}}@_Z20callee_with_cxx_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR1]] personality ptr 
@__gxx_personality_v0 {
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP0]], 0
+// CHECK-NEXT:    br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
+// CHECK:       if.then:
+// CHECK-NEXT:    [[EXCEPTION:%.*]] = call ptr @__cxa_allocate_exception(i64 
4) #[[ATTR4]]
+// CHECK-NEXT:    store i32 42, ptr [[EXCEPTION]], align 16
+// CHECK-NEXT:    invoke void @__cxa_throw(ptr [[EXCEPTION]], ptr @_ZTIi, ptr 
null) #[[ATTR5]]
+// CHECK-NEXT:    to label [[UNREACHABLE:%.*]] unwind label 
[[TERMINATE_LPAD:%.*]]
+// CHECK:       if.end:
+// CHECK-NEXT:    ret i32 24
+// CHECK:       terminate.lpad:
+// CHECK-NEXT:    [[TMP1:%.*]] = landingpad { ptr, i32 }
+// CHECK-NEXT:    catch ptr null
+// CHECK-NEXT:    [[TMP2:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 0
+// CHECK-NEXT:    call void @__clang_call_terminate(ptr [[TMP2]]) 
#[[ATTR6:[0-9]+]]
+// CHECK-NEXT:    unreachable
+// CHECK:       unreachable:
+// CHECK-NEXT:    unreachable
+//
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone
+// CHECK-LABEL: define 
{{[^@]+}}@_Z50early_caller_of_callee_with_cxx_attr_with_cxx_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR1]] {
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[CALL:%.*]] = call noundef i32 
@_Z20callee_with_cxx_attri(i32 noundef [[TMP0]]) #[[ATTR4]]
+// CHECK-NEXT:    ret i32 [[CALL]]
+//
+
+
+// Forward declarations:
+
+__attribute__((pure)) int callee_with_clang_attr(int a);
+int callee_with_cxx_attr(int a) noexcept;
+
+// Calls to forward declarations:
+
+__attribute__((pure)) int 
early_caller_of_callee_with_clang_attr_with_clang_attr(int a) {
+  return callee_with_clang_attr(a);
+}
+
+int early_caller_of_callee_with_clang_attr_with_cxx_attr(int a) noexcept {
+  return callee_with_clang_attr(a);
+}
+
+__attribute__((pure)) int 
early_caller_of_callee_with_cxx_attr_with_clang_attr(int a) {
+  return callee_with_cxx_attr(a);
+}
+
+int early_caller_of_callee_with_cxx_attr_with_cxx_attr(int a) noexcept {
+  return callee_with_cxx_attr(a);
+}
+
+// Definitions:
+
+__attribute__((pure)) int callee_with_clang_attr(int a) {
+  if(a)
+    throw int(42);
+  return 24;
+}
+
+int callee_with_cxx_attr(int a) noexcept {
+  if(a)
+    throw int(42);
+  return 24;
+}
+
+// Calls to definitions:
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone willreturn 
memory(read)
+// CHECK-LABEL: define 
{{[^@]+}}@_Z53late_caller_of_callee_with_clang_attr_with_clang_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR0]] {
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[CALL:%.*]] = call noundef i32 
@_Z22callee_with_clang_attri(i32 noundef [[TMP0]]) #[[ATTR3]]
+// CHECK-NEXT:    ret i32 [[CALL]]
+//
+__attribute__((pure)) int 
late_caller_of_callee_with_clang_attr_with_clang_attr(int a) {
+  return callee_with_clang_attr(a);
+}
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone
+// CHECK-LABEL: define 
{{[^@]+}}@_Z51late_caller_of_callee_with_clang_attr_with_cxx_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR1]] {
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[CALL:%.*]] = call noundef i32 
@_Z22callee_with_clang_attri(i32 noundef [[TMP0]]) #[[ATTR3]]
+// CHECK-NEXT:    ret i32 [[CALL]]
+//
+int late_caller_of_callee_with_clang_attr_with_cxx_attr(int a) noexcept {
+  return callee_with_clang_attr(a);
+}
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone willreturn 
memory(read)
+// CHECK-LABEL: define 
{{[^@]+}}@_Z51late_caller_of_callee_with_cxx_attr_with_clang_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR0]] {
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[CALL:%.*]] = call noundef i32 
@_Z20callee_with_cxx_attri(i32 noundef [[TMP0]]) #[[ATTR4]]
+// CHECK-NEXT:    ret i32 [[CALL]]
+//
+__attribute__((pure)) int 
late_caller_of_callee_with_cxx_attr_with_clang_attr(int a) {
+  return callee_with_cxx_attr(a);
+}
+
+// CHECK: Function Attrs: mustprogress noinline nounwind optnone
+// CHECK-LABEL: define 
{{[^@]+}}@_Z49late_caller_of_callee_with_cxx_attr_with_cxx_attri
+// CHECK-SAME: (i32 noundef [[A:%.*]]) #[[ATTR1]] {
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
+// CHECK-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A_ADDR]], align 4
+// CHECK-NEXT:    [[CALL:%.*]] = call noundef i32 
@_Z20callee_with_cxx_attri(i32 noundef [[TMP0]]) #[[ATTR4]]
+// CHECK-NEXT:    ret i32 [[CALL]]
+//
+int late_caller_of_callee_with_cxx_attr_with_cxx_attr(int a) noexcept {
+  return callee_with_cxx_attr(a);
+}


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to