[PATCH] D109003: Ensure field-annotations on pointers properly match the AS of the field.
Erich Keane via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 31 09:56:15 PDT 2021
erichkeane created this revision.
erichkeane added reviewers: Tyker, aaron.ballman.
Herald added subscribers: Naghasan, Anastasia.
erichkeane requested review of this revision.
Discovered in SYCL, the field annotations were always cast to an i8*,
which is an invalid bitcast for a pointer type with an address space.
This patch makes sure that we create an intrinsic that takes a pointer
to the correct address-space and properly do our casts.
Repository:
rC Clang
https://reviews.llvm.org/D109003
Files:
clang/lib/CodeGen/CodeGenFunction.cpp
clang/test/CodeGenSYCL/field-annotate-addr-space.cpp
Index: clang/test/CodeGenSYCL/field-annotate-addr-space.cpp
===================================================================
--- /dev/null
+++ clang/test/CodeGenSYCL/field-annotate-addr-space.cpp
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -triple spir64 -fsycl-is-device -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s
+
+// CHECK: [[ANNOT:.+]] = private unnamed_addr constant {{.*}}c"my_annotation\00"
+
+struct HasField {
+ // This caused an assertion on creating a bitcast here,
+ // since the address space didn't match.
+ [[clang::annotate("my_annotation")]]
+ int *a;
+};
+
+void foo(int *b) {
+ struct HasField f;
+ // CHECK: %[[A:.+]] = getelementptr inbounds %struct.HasField, %struct.HasField addrspace(4)* %{{.+}}
+ // CHECK: %[[BITCAST:.+]] = bitcast i32 addrspace(4)* addrspace(4)* %[[A]] to i8 addrspace(4)*
+ // CHECK: %[[CALL:.+]] = call i8 addrspace(4)* @llvm.ptr.annotation.p4i8(i8 addrspace(4)* %[[BITCAST]], i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[ANNOT]]
+ // CHECK: bitcast i8 addrspace(4)* %[[CALL]] to i32 addrspace(4)* addrspace(4)*
+ f.a = b;
+}
Index: clang/lib/CodeGen/CodeGenFunction.cpp
===================================================================
--- clang/lib/CodeGen/CodeGenFunction.cpp
+++ clang/lib/CodeGen/CodeGenFunction.cpp
@@ -2405,15 +2405,19 @@
assert(D->hasAttr<AnnotateAttr>() && "no annotate attribute");
llvm::Value *V = Addr.getPointer();
llvm::Type *VTy = V->getType();
- llvm::Function *F = CGM.getIntrinsic(llvm::Intrinsic::ptr_annotation,
- CGM.Int8PtrTy);
+ llvm::PointerType *PTy = dyn_cast<llvm::PointerType>(VTy);
+ unsigned AS = PTy ? PTy->getAddressSpace() : 0;
+ llvm::PointerType *IntrinTy =
+ llvm::PointerType::getWithSamePointeeType(CGM.Int8PtrTy, AS);
+ llvm::Function *F =
+ CGM.getIntrinsic(llvm::Intrinsic::ptr_annotation, IntrinTy);
for (const auto *I : D->specific_attrs<AnnotateAttr>()) {
// FIXME Always emit the cast inst so we can differentiate between
// annotation on the first field of a struct and annotation on the struct
// itself.
- if (VTy != CGM.Int8PtrTy)
- V = Builder.CreateBitCast(V, CGM.Int8PtrTy);
+ if (VTy != IntrinTy)
+ V = Builder.CreateBitCast(V, IntrinTy);
V = EmitAnnotationCall(F, V, I->getAnnotation(), D->getLocation(), I);
V = Builder.CreateBitCast(V, VTy);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D109003.369726.patch
Type: text/x-patch
Size: 2398 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210831/698d7e9a/attachment.bin>
More information about the cfe-commits
mailing list