|
| 1 | +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-globals all --no-generate-body-for-unused-prefixes --version 4 |
1 | 2 | // RUN: %clang_cc1 -I%S %s -triple amdgcn-amd-amdhsa -emit-llvm -fcxx-exceptions -fexceptions -o - | FileCheck %s
|
| 3 | +// RUN: %clang_cc1 -I%S %s -triple spirv64-unknown-unknown -fsycl-is-device -emit-llvm -fcxx-exceptions -fexceptions -o - | FileCheck %s --check-prefix=WITH-NONZERO-DEFAULT-AS |
| 4 | + |
2 | 5 | struct A { virtual void f(); };
|
3 | 6 | struct B : A { };
|
4 | 7 |
|
5 |
| -// CHECK: {{define.*@_Z1fP1A}} |
6 |
| -// CHECK-SAME: personality ptr @__gxx_personality_v0 |
7 | 8 | B fail;
|
| 9 | +//. |
| 10 | +// CHECK: @_ZTV1B = linkonce_odr unnamed_addr addrspace(1) constant { [3 x ptr addrspace(1)] } { [3 x ptr addrspace(1)] [ptr addrspace(1) null, ptr addrspace(1) @_ZTI1B, ptr addrspace(1) addrspacecast (ptr @_ZN1A1fEv to ptr addrspace(1))] }, comdat, align 8 |
| 11 | +// CHECK: @fail = addrspace(1) global { ptr addrspace(1) } { ptr addrspace(1) getelementptr inbounds inrange(-16, 8) ({ [3 x ptr addrspace(1)] }, ptr addrspace(1) @_ZTV1B, i32 0, i32 0, i32 2) }, align 8 |
| 12 | +// CHECK: @_ZTI1A = external addrspace(1) constant ptr addrspace(1) |
| 13 | +// CHECK: @_ZTVN10__cxxabiv120__si_class_type_infoE = external addrspace(1) global [0 x ptr addrspace(1)] |
| 14 | +// CHECK: @_ZTS1B = linkonce_odr addrspace(1) constant [3 x i8] c"1B\00", comdat, align 1 |
| 15 | +// CHECK: @_ZTI1B = linkonce_odr addrspace(1) constant { ptr addrspace(1), ptr addrspace(1), ptr addrspace(1) } { ptr addrspace(1) getelementptr inbounds (ptr addrspace(1), ptr addrspace(1) @_ZTVN10__cxxabiv120__si_class_type_infoE, i64 2), ptr addrspace(1) @_ZTS1B, ptr addrspace(1) @_ZTI1A }, comdat, align 8 |
| 16 | +// CHECK: @__oclc_ABI_version = weak_odr hidden local_unnamed_addr addrspace(4) constant i32 500 |
| 17 | +//. |
| 18 | +// WITH-NONZERO-DEFAULT-AS: @_ZTV1B = linkonce_odr unnamed_addr addrspace(1) constant { [3 x ptr addrspace(1)] } { [3 x ptr addrspace(1)] [ptr addrspace(1) null, ptr addrspace(1) @_ZTI1B, ptr addrspace(1) addrspacecast (ptr @_ZN1A1fEv to ptr addrspace(1))] }, comdat, align 8 |
| 19 | +// WITH-NONZERO-DEFAULT-AS: @fail = addrspace(1) global { ptr addrspace(1) } { ptr addrspace(1) getelementptr inbounds inrange(-16, 8) ({ [3 x ptr addrspace(1)] }, ptr addrspace(1) @_ZTV1B, i32 0, i32 0, i32 2) }, align 8 |
| 20 | +// WITH-NONZERO-DEFAULT-AS: @_ZTI1A = external addrspace(1) constant ptr addrspace(1) |
| 21 | +// WITH-NONZERO-DEFAULT-AS: @_ZTVN10__cxxabiv120__si_class_type_infoE = external addrspace(1) global [0 x ptr addrspace(1)] |
| 22 | +// WITH-NONZERO-DEFAULT-AS: @_ZTS1B = linkonce_odr addrspace(1) constant [3 x i8] c"1B\00", comdat, align 1 |
| 23 | +// WITH-NONZERO-DEFAULT-AS: @_ZTI1B = linkonce_odr addrspace(1) constant { ptr addrspace(1), ptr addrspace(1), ptr addrspace(1) } { ptr addrspace(1) getelementptr inbounds (ptr addrspace(1), ptr addrspace(1) @_ZTVN10__cxxabiv120__si_class_type_infoE, i64 2), ptr addrspace(1) @_ZTS1B, ptr addrspace(1) @_ZTI1A }, comdat, align 8 |
| 24 | +//. |
| 25 | +// CHECK-LABEL: define dso_local noundef nonnull align 8 dereferenceable(8) ptr @_Z1fP1A( |
| 26 | +// CHECK-SAME: ptr noundef [[A:%.*]]) #[[ATTR0:[0-9]+]] personality ptr @__gxx_personality_v0 { |
| 27 | +// CHECK-NEXT: entry: |
| 28 | +// CHECK-NEXT: [[RETVAL:%.*]] = alloca ptr, align 8, addrspace(5) |
| 29 | +// CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8, addrspace(5) |
| 30 | +// CHECK-NEXT: [[EXN_SLOT:%.*]] = alloca ptr, align 8, addrspace(5) |
| 31 | +// CHECK-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4, addrspace(5) |
| 32 | +// CHECK-NEXT: [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr |
| 33 | +// CHECK-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr |
| 34 | +// CHECK-NEXT: store ptr [[A]], ptr [[A_ADDR_ASCAST]], align 8 |
| 35 | +// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR_ASCAST]], align 8 |
| 36 | +// CHECK-NEXT: [[TMP1:%.*]] = call ptr @__dynamic_cast(ptr [[TMP0]], ptr addrspace(1) @_ZTI1A, ptr addrspace(1) @_ZTI1B, i64 0) #[[ATTR3:[0-9]+]] |
| 37 | +// CHECK-NEXT: [[TMP2:%.*]] = icmp eq ptr [[TMP1]], null |
| 38 | +// CHECK-NEXT: br i1 [[TMP2]], label [[DYNAMIC_CAST_BAD_CAST:%.*]], label [[DYNAMIC_CAST_END:%.*]] |
| 39 | +// CHECK: dynamic_cast.bad_cast: |
| 40 | +// CHECK-NEXT: invoke void @__cxa_bad_cast() #[[ATTR4:[0-9]+]] |
| 41 | +// CHECK-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]] |
| 42 | +// CHECK: invoke.cont: |
| 43 | +// CHECK-NEXT: unreachable |
| 44 | +// CHECK: dynamic_cast.end: |
| 45 | +// CHECK-NEXT: br label [[TRY_CONT:%.*]] |
| 46 | +// CHECK: lpad: |
| 47 | +// CHECK-NEXT: [[TMP3:%.*]] = landingpad { ptr, i32 } |
| 48 | +// CHECK-NEXT: catch ptr null |
| 49 | +// CHECK-NEXT: [[TMP4:%.*]] = extractvalue { ptr, i32 } [[TMP3]], 0 |
| 50 | +// CHECK-NEXT: store ptr [[TMP4]], ptr addrspace(5) [[EXN_SLOT]], align 8 |
| 51 | +// CHECK-NEXT: [[TMP5:%.*]] = extractvalue { ptr, i32 } [[TMP3]], 1 |
| 52 | +// CHECK-NEXT: store i32 [[TMP5]], ptr addrspace(5) [[EHSELECTOR_SLOT]], align 4 |
| 53 | +// CHECK-NEXT: br label [[CATCH:%.*]] |
| 54 | +// CHECK: catch: |
| 55 | +// CHECK-NEXT: [[EXN:%.*]] = load ptr, ptr addrspace(5) [[EXN_SLOT]], align 8 |
| 56 | +// CHECK-NEXT: [[TMP6:%.*]] = call ptr @__cxa_begin_catch(ptr [[EXN]]) #[[ATTR3]] |
| 57 | +// CHECK-NEXT: call void @__cxa_end_catch() |
| 58 | +// CHECK-NEXT: br label [[TRY_CONT]] |
| 59 | +// CHECK: try.cont: |
| 60 | +// CHECK-NEXT: ret ptr addrspacecast (ptr addrspace(1) @fail to ptr) |
| 61 | +// |
| 62 | +// WITH-NONZERO-DEFAULT-AS-LABEL: define spir_func noundef align 8 dereferenceable(8) ptr addrspace(4) @_Z1fP1A( |
| 63 | +// WITH-NONZERO-DEFAULT-AS-SAME: ptr addrspace(4) noundef [[A:%.*]]) #[[ATTR0:[0-9]+]] personality ptr @__gxx_personality_v0 { |
| 64 | +// WITH-NONZERO-DEFAULT-AS-NEXT: entry: |
| 65 | +// WITH-NONZERO-DEFAULT-AS-NEXT: [[RETVAL:%.*]] = alloca ptr addrspace(4), align 8 |
| 66 | +// WITH-NONZERO-DEFAULT-AS-NEXT: [[A_ADDR:%.*]] = alloca ptr addrspace(4), align 8 |
| 67 | +// WITH-NONZERO-DEFAULT-AS-NEXT: [[EXN_SLOT:%.*]] = alloca ptr addrspace(4), align 8 |
| 68 | +// WITH-NONZERO-DEFAULT-AS-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4 |
| 69 | +// WITH-NONZERO-DEFAULT-AS-NEXT: [[RETVAL_ASCAST:%.*]] = addrspacecast ptr [[RETVAL]] to ptr addrspace(4) |
| 70 | +// WITH-NONZERO-DEFAULT-AS-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4) |
| 71 | +// WITH-NONZERO-DEFAULT-AS-NEXT: store ptr addrspace(4) [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 8 |
| 72 | +// WITH-NONZERO-DEFAULT-AS-NEXT: [[TMP0:%.*]] = load ptr addrspace(4), ptr addrspace(4) [[A_ADDR_ASCAST]], align 8 |
| 73 | +// WITH-NONZERO-DEFAULT-AS-NEXT: [[TMP1:%.*]] = call spir_func ptr addrspace(4) @__dynamic_cast(ptr addrspace(4) [[TMP0]], ptr addrspace(1) @_ZTI1A, ptr addrspace(1) @_ZTI1B, i64 0) #[[ATTR3:[0-9]+]] |
| 74 | +// WITH-NONZERO-DEFAULT-AS-NEXT: [[TMP2:%.*]] = icmp eq ptr addrspace(4) [[TMP1]], null |
| 75 | +// WITH-NONZERO-DEFAULT-AS-NEXT: br i1 [[TMP2]], label [[DYNAMIC_CAST_BAD_CAST:%.*]], label [[DYNAMIC_CAST_END:%.*]] |
| 76 | +// WITH-NONZERO-DEFAULT-AS: dynamic_cast.bad_cast: |
| 77 | +// WITH-NONZERO-DEFAULT-AS-NEXT: invoke spir_func void @__cxa_bad_cast() #[[ATTR4:[0-9]+]] |
| 78 | +// WITH-NONZERO-DEFAULT-AS-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]] |
| 79 | +// WITH-NONZERO-DEFAULT-AS: invoke.cont: |
| 80 | +// WITH-NONZERO-DEFAULT-AS-NEXT: unreachable |
| 81 | +// WITH-NONZERO-DEFAULT-AS: dynamic_cast.end: |
| 82 | +// WITH-NONZERO-DEFAULT-AS-NEXT: br label [[TRY_CONT:%.*]] |
| 83 | +// WITH-NONZERO-DEFAULT-AS: lpad: |
| 84 | +// WITH-NONZERO-DEFAULT-AS-NEXT: [[TMP3:%.*]] = landingpad { ptr addrspace(4), i32 } |
| 85 | +// WITH-NONZERO-DEFAULT-AS-NEXT: catch ptr addrspace(4) null |
| 86 | +// WITH-NONZERO-DEFAULT-AS-NEXT: [[TMP4:%.*]] = extractvalue { ptr addrspace(4), i32 } [[TMP3]], 0 |
| 87 | +// WITH-NONZERO-DEFAULT-AS-NEXT: store ptr addrspace(4) [[TMP4]], ptr [[EXN_SLOT]], align 8 |
| 88 | +// WITH-NONZERO-DEFAULT-AS-NEXT: [[TMP5:%.*]] = extractvalue { ptr addrspace(4), i32 } [[TMP3]], 1 |
| 89 | +// WITH-NONZERO-DEFAULT-AS-NEXT: store i32 [[TMP5]], ptr [[EHSELECTOR_SLOT]], align 4 |
| 90 | +// WITH-NONZERO-DEFAULT-AS-NEXT: br label [[CATCH:%.*]] |
| 91 | +// WITH-NONZERO-DEFAULT-AS: catch: |
| 92 | +// WITH-NONZERO-DEFAULT-AS-NEXT: [[EXN:%.*]] = load ptr addrspace(4), ptr [[EXN_SLOT]], align 8 |
| 93 | +// WITH-NONZERO-DEFAULT-AS-NEXT: [[TMP6:%.*]] = call spir_func ptr addrspace(4) @__cxa_begin_catch(ptr addrspace(4) [[EXN]]) #[[ATTR3]] |
| 94 | +// WITH-NONZERO-DEFAULT-AS-NEXT: call spir_func void @__cxa_end_catch() |
| 95 | +// WITH-NONZERO-DEFAULT-AS-NEXT: br label [[TRY_CONT]] |
| 96 | +// WITH-NONZERO-DEFAULT-AS: try.cont: |
| 97 | +// WITH-NONZERO-DEFAULT-AS-NEXT: ret ptr addrspace(4) addrspacecast (ptr addrspace(1) @fail to ptr addrspace(4)) |
| 98 | +// |
8 | 99 | const B& f(A *a) {
|
9 | 100 | try {
|
10 |
| - // CHECK: call ptr @__dynamic_cast |
11 |
| - // CHECK: br i1 |
12 |
| - // CHECK: invoke void @__cxa_bad_cast() [[NR:#[0-9]+]] |
13 | 101 | dynamic_cast<const B&>(*a);
|
14 | 102 | } catch (...) {
|
15 |
| - // CHECK: landingpad { ptr, i32 } |
16 |
| - // CHECK-NEXT: catch ptr null |
17 | 103 | }
|
18 | 104 | return fail;
|
19 | 105 | }
|
20 | 106 |
|
21 |
| -// CHECK: declare ptr @__dynamic_cast(ptr, ptr addrspace(1), ptr addrspace(1), i64) [[NUW_RO:#[0-9]+]] |
22 | 107 |
|
23 |
| -// CHECK: attributes [[NUW_RO]] = { nounwind willreturn memory(read) } |
24 |
| -// CHECK: attributes [[NR]] = { noreturn } |
| 108 | +//. |
| 109 | +// CHECK: attributes #[[ATTR0]] = { mustprogress noinline optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" } |
| 110 | +// CHECK: attributes #[[ATTR1:[0-9]+]] = { nounwind willreturn memory(read) } |
| 111 | +// CHECK: attributes #[[ATTR2:[0-9]+]] = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" } |
| 112 | +// CHECK: attributes #[[ATTR3]] = { nounwind } |
| 113 | +// CHECK: attributes #[[ATTR4]] = { noreturn } |
| 114 | +//. |
| 115 | +// WITH-NONZERO-DEFAULT-AS: attributes #[[ATTR0]] = { convergent mustprogress noinline norecurse nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" } |
| 116 | +// WITH-NONZERO-DEFAULT-AS: attributes #[[ATTR1:[0-9]+]] = { nounwind willreturn memory(read) } |
| 117 | +// WITH-NONZERO-DEFAULT-AS: attributes #[[ATTR2:[0-9]+]] = { convergent nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" } |
| 118 | +// WITH-NONZERO-DEFAULT-AS: attributes #[[ATTR3]] = { nounwind } |
| 119 | +// WITH-NONZERO-DEFAULT-AS: attributes #[[ATTR4]] = { noreturn } |
| 120 | +//. |
| 121 | +// CHECK: [[META0:![0-9]+]] = !{i32 1, !"amdhsa_code_object_version", i32 500} |
| 122 | +// CHECK: [[META1:![0-9]+]] = !{i32 1, !"wchar_size", i32 4} |
| 123 | +// CHECK: [[META2:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"} |
| 124 | +//. |
| 125 | +// WITH-NONZERO-DEFAULT-AS: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4} |
| 126 | +// WITH-NONZERO-DEFAULT-AS: [[META1:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"} |
| 127 | +//. |
0 commit comments