Skip to content

Commit 10edb49

Browse files
authored
[Clang][CodeGen] Start migrating away from assuming the Default AS is 0 (#88182)
At the moment, Clang is rather liberal in assuming that 0 (and by extension unqualified) is always a safe default. This does not work for targets that actually use a different value for the default / generic AS (for example, the SPIRV that obtains from HIPSPV or SYCL). This patch is a first, fairly safe step towards trying to clear things up by querying a modules' default AS from the target, rather than assuming it's 0, alongside fixing a few places where things break / we encode the 0 == DefaultAS assumption. A bunch of existing tests are extended to check for non-zero default AS usage.
1 parent c587483 commit 10edb49

28 files changed

+283
-98
lines changed

clang/lib/CodeGen/CGException.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,7 +1052,8 @@ static void emitWasmCatchPadBlock(CodeGenFunction &CGF,
10521052
CGF.Builder.CreateStore(Exn, CGF.getExceptionSlot());
10531053
llvm::CallInst *Selector = CGF.Builder.CreateCall(GetSelectorFn, CPI);
10541054

1055-
llvm::Function *TypeIDFn = CGF.CGM.getIntrinsic(llvm::Intrinsic::eh_typeid_for);
1055+
llvm::Function *TypeIDFn =
1056+
CGF.CGM.getIntrinsic(llvm::Intrinsic::eh_typeid_for, {CGF.VoidPtrTy});
10561057

10571058
// If there's only a single catch-all, branch directly to its handler.
10581059
if (CatchScope.getNumHandlers() == 1 &&
@@ -1137,7 +1138,7 @@ static void emitCatchDispatchBlock(CodeGenFunction &CGF,
11371138

11381139
// Select the right handler.
11391140
llvm::Function *llvm_eh_typeid_for =
1140-
CGF.CGM.getIntrinsic(llvm::Intrinsic::eh_typeid_for);
1141+
CGF.CGM.getIntrinsic(llvm::Intrinsic::eh_typeid_for, {CGF.VoidPtrTy});
11411142
llvm::Type *argTy = llvm_eh_typeid_for->getArg(0)->getType();
11421143
LangAS globAS = CGF.CGM.GetGlobalVarAddressSpace(nullptr);
11431144

clang/lib/CodeGen/CGExprCXX.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2216,7 +2216,12 @@ static llvm::Value *EmitTypeidFromVTable(CodeGenFunction &CGF, const Expr *E,
22162216
}
22172217

22182218
llvm::Value *CodeGenFunction::EmitCXXTypeidExpr(const CXXTypeidExpr *E) {
2219-
llvm::Type *PtrTy = llvm::PointerType::getUnqual(getLLVMContext());
2219+
// Ideally, we would like to use GlobalsInt8PtrTy here, however, we cannot,
2220+
// primarily because the result of applying typeid is a value of type
2221+
// type_info, which is declared & defined by the standard library
2222+
// implementation and expects to operate on the generic (default) AS.
2223+
// https://reviews.llvm.org/D157452 has more context, and a possible solution.
2224+
llvm::Type *PtrTy = Int8PtrTy;
22202225
LangAS GlobAS = CGM.GetGlobalVarAddressSpace(nullptr);
22212226

22222227
auto MaybeASCast = [=](auto &&TypeInfo) {

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,8 @@ CodeGenModule::CodeGenModule(ASTContext &C,
368368
IntTy = llvm::IntegerType::get(LLVMContext, C.getTargetInfo().getIntWidth());
369369
IntPtrTy = llvm::IntegerType::get(LLVMContext,
370370
C.getTargetInfo().getMaxPointerWidth());
371-
Int8PtrTy = llvm::PointerType::get(LLVMContext, 0);
371+
Int8PtrTy = llvm::PointerType::get(LLVMContext,
372+
C.getTargetAddressSpace(LangAS::Default));
372373
const llvm::DataLayout &DL = M.getDataLayout();
373374
AllocaInt8PtrTy =
374375
llvm::PointerType::get(LLVMContext, DL.getAllocaAddrSpace());

clang/lib/CodeGen/CodeGenTypeCache.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ struct CodeGenTypeCache {
5151
llvm::IntegerType *PtrDiffTy;
5252
};
5353

54-
/// void*, void** in address space 0
54+
/// void*, void** in the target's default address space (often 0)
5555
union {
5656
llvm::PointerType *UnqualPtrTy;
5757
llvm::PointerType *VoidPtrTy;
Lines changed: 113 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,127 @@
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
12
// 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+
25
struct A { virtual void f(); };
36
struct B : A { };
47

5-
// CHECK: {{define.*@_Z1fP1A}}
6-
// CHECK-SAME: personality ptr @__gxx_personality_v0
78
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+
//
899
const B& f(A *a) {
9100
try {
10-
// CHECK: call ptr @__dynamic_cast
11-
// CHECK: br i1
12-
// CHECK: invoke void @__cxa_bad_cast() [[NR:#[0-9]+]]
13101
dynamic_cast<const B&>(*a);
14102
} catch (...) {
15-
// CHECK: landingpad { ptr, i32 }
16-
// CHECK-NEXT: catch ptr null
17103
}
18104
return fail;
19105
}
20106

21-
// CHECK: declare ptr @__dynamic_cast(ptr, ptr addrspace(1), ptr addrspace(1), i64) [[NUW_RO:#[0-9]+]]
22107

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+
//.

clang/test/CodeGenCXX/eh.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ namespace test5 {
8181
// CHECK: invoke void @__cxa_throw(ptr [[EXNOBJ]], ptr @_ZTIN5test51AE, ptr @_ZN5test51AD1Ev) [[NR]]
8282
// CHECK-NEXT: to label {{%.*}} unwind label %[[HANDLER:[^ ]*]]
8383
// : [[HANDLER]]: (can't check this in Release-Asserts builds)
84-
// CHECK: {{%.*}} = call i32 @llvm.eh.typeid.for(ptr @_ZTIN5test51AE)
84+
// CHECK: {{%.*}} = call i32 @llvm.eh.typeid.for.p0(ptr @_ZTIN5test51AE)
8585
}
8686

8787
namespace test6 {
@@ -96,7 +96,7 @@ namespace test6 {
9696

9797
// PR7127
9898
namespace test7 {
99-
// CHECK-LABEL: define{{.*}} i32 @_ZN5test73fooEv()
99+
// CHECK-LABEL: define{{.*}} i32 @_ZN5test73fooEv()
100100
// CHECK-SAME: personality ptr @__gxx_personality_v0
101101
int foo() {
102102
// CHECK: [[CAUGHTEXNVAR:%.*]] = alloca ptr
@@ -119,7 +119,7 @@ namespace test7 {
119119
// CHECK-NEXT: store i32 [[SELECTOR]], ptr [[SELECTORVAR]]
120120
// CHECK-NEXT: br label
121121
// CHECK: [[SELECTOR:%.*]] = load i32, ptr [[SELECTORVAR]]
122-
// CHECK-NEXT: [[T0:%.*]] = call i32 @llvm.eh.typeid.for(ptr @_ZTIi)
122+
// CHECK-NEXT: [[T0:%.*]] = call i32 @llvm.eh.typeid.for.p0(ptr @_ZTIi)
123123
// CHECK-NEXT: icmp eq i32 [[SELECTOR]], [[T0]]
124124
// CHECK-NEXT: br i1
125125
// CHECK: [[T0:%.*]] = load ptr, ptr [[CAUGHTEXNVAR]]

clang/test/CodeGenCXX/nrvo.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -628,7 +628,7 @@ void may_throw();
628628
// CHECK-EH-03-NEXT: br label [[CATCH_DISPATCH:%.*]]
629629
// CHECK-EH-03: catch.dispatch:
630630
// CHECK-EH-03-NEXT: [[SEL:%.*]] = load i32, ptr [[EHSELECTOR_SLOT]], align 4
631-
// CHECK-EH-03-NEXT: [[TMP3:%.*]] = call i32 @llvm.eh.typeid.for(ptr @_ZTI1X) #[[ATTR7]]
631+
// CHECK-EH-03-NEXT: [[TMP3:%.*]] = call i32 @llvm.eh.typeid.for.p0(ptr @_ZTI1X) #[[ATTR7]]
632632
// CHECK-EH-03-NEXT: [[MATCHES:%.*]] = icmp eq i32 [[SEL]], [[TMP3]]
633633
// CHECK-EH-03-NEXT: br i1 [[MATCHES]], label [[CATCH:%.*]], label [[EH_RESUME:%.*]]
634634
// CHECK-EH-03: catch:
@@ -707,7 +707,7 @@ void may_throw();
707707
// CHECK-EH-11-NEXT: br label [[CATCH_DISPATCH:%.*]]
708708
// CHECK-EH-11: catch.dispatch:
709709
// CHECK-EH-11-NEXT: [[SEL:%.*]] = load i32, ptr [[EHSELECTOR_SLOT]], align 4
710-
// CHECK-EH-11-NEXT: [[TMP3:%.*]] = call i32 @llvm.eh.typeid.for(ptr @_ZTI1X) #[[ATTR6]]
710+
// CHECK-EH-11-NEXT: [[TMP3:%.*]] = call i32 @llvm.eh.typeid.for.p0(ptr @_ZTI1X) #[[ATTR6]]
711711
// CHECK-EH-11-NEXT: [[MATCHES:%.*]] = icmp eq i32 [[SEL]], [[TMP3]]
712712
// CHECK-EH-11-NEXT: br i1 [[MATCHES]], label [[CATCH:%.*]], label [[EH_RESUME:%.*]]
713713
// CHECK-EH-11: catch:

clang/test/CodeGenCXX/template-param-objects-address-space.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// RUN: %clang_cc1 -triple amdgcn-amd-amdhsa -std=c++20 %s -emit-llvm -o - | FileCheck %s
2+
// RUN: %clang_cc1 -triple spirv64-unknown-unknown -fsycl-is-device -std=c++20 %s -emit-llvm -o - | FileCheck %s --check-prefix=WITH-NONZERO-DEFAULT-AS
23

34
struct S { char buf[32]; };
45
template<S s> constexpr const char *begin() { return s.buf; }
@@ -8,25 +9,34 @@ extern const void *callee(const S*);
89
template<S s> constexpr const void* observable_addr() { return callee(&s); }
910

1011
// CHECK: [[HELLO:@_ZTAXtl1StlA32_cLc104ELc101ELc108ELc108ELc111ELc32ELc119ELc111ELc114ELc108ELc100EEEE]]
12+
// WITH-NONZERO-DEFAULT-AS: [[HELLO:@_ZTAXtl1StlA32_cLc104ELc101ELc108ELc108ELc111ELc32ELc119ELc111ELc114ELc108ELc100EEEE]]
1113
// CHECK-SAME: = linkonce_odr addrspace(1) constant { <{ [11 x i8], [21 x i8] }> } { <{ [11 x i8], [21 x i8] }> <{ [11 x i8] c"hello world", [21 x i8] zeroinitializer }> }, comdat
1214

1315
// CHECK: @p
1416
// CHECK-SAME: addrspace(1) global ptr addrspacecast (ptr addrspace(1) [[HELLO]] to ptr)
17+
// WITH-NONZERO-DEFAULT-AS: addrspace(1) global ptr addrspace(4) addrspacecast (ptr addrspace(1) [[HELLO]] to ptr addrspace(4))
1518
const char *p = begin<S{"hello world"}>();
1619

1720
// CHECK: @q
1821
// CHECK-SAME: addrspace(1) global ptr addrspacecast (ptr addrspace(1) getelementptr (i8, ptr addrspace(1) [[HELLO]], i64 11) to ptr)
22+
// WITH-NONZERO-DEFAULT-AS: addrspace(1) global ptr addrspace(4) addrspacecast (ptr addrspace(1) getelementptr (i8, ptr addrspace(1) [[HELLO]], i64 11) to ptr addrspace(4))
1923
const char *q = end<S{"hello world"}>();
2024

2125
const void *(*r)() = &retval<S{"hello world"}>;
2226

2327
// CHECK: @s
2428
// CHECK-SAME: addrspace(1) global ptr null
29+
// WITH-NONZERO-DEFAULT-AS: addrspace(1) global ptr addrspace(4) null
2530
const void *s = observable_addr<S{"hello world"}>();
2631

2732
// CHECK: define linkonce_odr noundef ptr @_Z6retvalIXtl1StlA32_cLc104ELc101ELc108ELc108ELc111ELc32ELc119ELc111ELc114ELc108ELc100EEEEEPKvv()
33+
// WITH-NONZERO-DEFAULT-AS: define linkonce_odr {{.*}} noundef ptr addrspace(4) @_Z6retvalIXtl1StlA32_cLc104ELc101ELc108ELc108ELc111ELc32ELc119ELc111ELc114ELc108ELc100EEEEEPKvv()
2834
// CHECK: ret ptr addrspacecast (ptr addrspace(1) [[HELLO]] to ptr)
35+
// WITH-NONZERO-DEFAULT-AS: ret ptr addrspace(4) addrspacecast (ptr addrspace(1) [[HELLO]] to ptr addrspace(4))
2936

3037
// CHECK: define linkonce_odr noundef ptr @_Z15observable_addrIXtl1StlA32_cLc104ELc101ELc108ELc108ELc111ELc32ELc119ELc111ELc114ELc108ELc100EEEEEPKvv()
38+
// WITH-NONZERO-DEFAULT-AS: define linkonce_odr {{.*}} noundef ptr addrspace(4) @_Z15observable_addrIXtl1StlA32_cLc104ELc101ELc108ELc108ELc111ELc32ELc119ELc111ELc114ELc108ELc100EEEEEPKvv()
3139
// CHECK: %call = call noundef ptr @_Z6calleePK1S(ptr noundef addrspacecast (ptr addrspace(1) [[HELLO]] to ptr))
40+
// WITH-NONZERO-DEFAULT-AS: %call = call {{.*}} noundef ptr addrspace(4) @_Z6calleePK1S(ptr addrspace(4) noundef addrspacecast (ptr addrspace(1) [[HELLO]] to ptr addrspace(4)))
3241
// CHECK: declare noundef ptr @_Z6calleePK1S(ptr noundef)
42+
// WITH-NONZERO-DEFAULT-AS: declare {{.*}} noundef ptr addrspace(4) @_Z6calleePK1S(ptr addrspace(4) noundef)

clang/test/CodeGenCXX/throw-expression-typeinfo-in-address-space.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// RUN: %clang_cc1 %s -triple amdgcn-amd-amdhsa -emit-llvm -fcxx-exceptions -fexceptions -std=c++11 -o - | FileCheck %s
2+
// RUN: %clang_cc1 %s -triple spirv64-unknown-unknown -fsycl-is-device -emit-llvm -fcxx-exceptions -fexceptions -std=c++11 -o - | FileCheck %s --check-prefix=WITH-NONZERO-DEFAULT-AS
23

34
struct X {
45
~X();
@@ -15,3 +16,4 @@ void f() {
1516
}
1617

1718
// CHECK: declare void @__cxa_throw(ptr, ptr addrspace(1), ptr)
19+
// WITH-NONZERO-DEFAULT-AS: declare{{.*}} void @__cxa_throw(ptr addrspace(4), ptr addrspace(1), ptr addrspace(4))

clang/test/CodeGenCXX/try-catch-with-address-space.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// RUN: %clang_cc1 %s -triple=amdgcn-amd-amdhsa -emit-llvm -o - -fcxx-exceptions -fexceptions | FileCheck %s
2+
// RUN: %clang_cc1 %s -triple=spirv64-unknown-unknown -fsycl-is-device -emit-llvm -o - -fcxx-exceptions -fexceptions | FileCheck %s --check-prefix=WITH-NONZERO-DEFAULT-AS
23

34
struct X { };
45

@@ -10,7 +11,8 @@ void f() {
1011
// CHECK: ptr addrspace(1) @_ZTI1X
1112
} catch (const X x) {
1213
// CHECK: catch ptr addrspace(1) @_ZTI1X
13-
// CHECK: call i32 @llvm.eh.typeid.for(ptr addrspacecast (ptr addrspace(1) @_ZTI1X to ptr))
14+
// CHECK: call i32 @llvm.eh.typeid.for.p0(ptr addrspacecast (ptr addrspace(1) @_ZTI1X to ptr))
15+
// WITH-NONZERO-DEFAULT-AS: call i32 @llvm.eh.typeid.for.p4(ptr addrspace(4) addrspacecast (ptr addrspace(1) @_ZTI1X to ptr addrspace(4)))
1416
}
1517
}
1618

@@ -20,6 +22,7 @@ void h() {
2022
// CHECK: ptr addrspace(1) @_ZTIPKc
2123
} catch (char const(&)[4]) {
2224
// CHECK: catch ptr addrspace(1) @_ZTIA4_c
23-
// CHECK: call i32 @llvm.eh.typeid.for(ptr addrspacecast (ptr addrspace(1) @_ZTIA4_c to ptr))
25+
// CHECK: call i32 @llvm.eh.typeid.for.p0(ptr addrspacecast (ptr addrspace(1) @_ZTIA4_c to ptr))
26+
// WITH-NONZERO-DEFAULT-AS: call i32 @llvm.eh.typeid.for.p4(ptr addrspace(4) addrspacecast (ptr addrspace(1) @_ZTIA4_c to ptr addrspace(4)))
2427
}
2528
}

0 commit comments

Comments
 (0)