From c481125d81516ec2c24a70932536abd9598a4e0e Mon Sep 17 00:00:00 2001 From: Jinsong Ji Date: Sun, 23 Jul 2023 06:30:07 -0700 Subject: [PATCH 1/5] Fix bad guard for INTEL_SYCL_OPAQUEPOINTER_READY --- clang/lib/CodeGen/ABIInfoImpl.cpp | 8 ++++++++ clang/lib/CodeGen/CGBuiltin.cpp | 4 +++- clang/lib/CodeGen/CGClass.cpp | 3 ++- clang/lib/CodeGen/ItaniumCXXABI.cpp | 4 ++++ llvm/include/llvm/IR/DerivedTypes.h | 3 +-- llvm/include/llvm/IR/Intrinsics.h | 3 +-- llvm/include/llvm/IR/Intrinsics.td | 8 ++++++++ llvm/lib/AsmParser/LLParser.cpp | 6 ++++-- llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 2 ++ llvm/lib/IR/LLVMContext.cpp | 3 ++- llvm/lib/IR/Verifier.cpp | 2 ++ 11 files changed, 37 insertions(+), 9 deletions(-) diff --git a/clang/lib/CodeGen/ABIInfoImpl.cpp b/clang/lib/CodeGen/ABIInfoImpl.cpp index f7ceda0355542..8717d993d2537 100644 --- a/clang/lib/CodeGen/ABIInfoImpl.cpp +++ b/clang/lib/CodeGen/ABIInfoImpl.cpp @@ -170,7 +170,11 @@ CodeGen::emitVoidPtrDirectVAArg(CodeGenFunction &CGF, Address VAListAddr, // Cast the element type to i8* if necessary. Some platforms define // va_list as a struct containing an i8* instead of just an i8*. if (VAListAddr.getElementType() != CGF.Int8PtrTy) +#ifndef INTEL_SYCL_OPAQUEPOINTER_READY VAListAddr = CGF.Builder.CreateElementBitCast(VAListAddr, CGF.Int8PtrTy); +#else + VAListAddr = VAListAddr.withElementType(CGF.Int8PtrTy); +#endif llvm::Value *Ptr = CGF.Builder.CreateLoad(VAListAddr, "argp.cur"); @@ -196,7 +200,11 @@ CodeGen::emitVoidPtrDirectVAArg(CodeGenFunction &CGF, Address VAListAddr, Addr = CGF.Builder.CreateConstInBoundsByteGEP(Addr, SlotSize - DirectSize); } +#ifndef INTEL_SYCL_OPAQUEPOINTER_READY Addr = CGF.Builder.CreateElementBitCast(Addr, DirectTy); +#else + return Addr.withElementType(DirectTy); +#endif return Addr; } diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 0da0763d49db8..3bce12223cfc2 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -16545,7 +16545,9 @@ Value *CodeGenFunction::EmitPPCBuiltinExpr(unsigned BuiltinID, // Storing the whole vector, simply store it on BE and reverse bytes and // store on LE. if (Width == 16) { +#ifndef INTEL_SYCL_OPAQUEPOINTER_READY Value *BC = Builder.CreateBitCast(Op0, Op2->getType()->getPointerTo()); +#endif Value *StVec = Op2; if (IsLE) { SmallVector RevMask; @@ -22628,7 +22630,7 @@ Value *CodeGenFunction::EmitHexagonBuiltinExpr(unsigned BuiltinID, case Hexagon::BI__builtin_HEXAGON_V6_vsubcarryo_128B: { // Get the type from the 0-th argument. llvm::Type *VecType = ConvertType(E->getArg(0)->getType()); -#ifdef INTEL_SYCL_OPAQUEPOINTER_READY +#ifndef INTEL_SYCL_OPAQUEPOINTER_READY Address PredAddr = Builder.CreateElementBitCast( EmitPointerWithAlignment(E->getArg(2)), VecType); #else // INTEL_SYCL_OPAQUEPOINTER_READY diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp index 52b017e741a3b..8e03541e97626 100644 --- a/clang/lib/CodeGen/CGClass.cpp +++ b/clang/lib/CodeGen/CGClass.cpp @@ -2633,9 +2633,10 @@ void CodeGenFunction::InitializeVTablePointer(const VPtr &Vptr) { llvm::FunctionType::get(CGM.Int32Ty, /*isVarArg=*/true) ->getPointerTo(ProgAS) ->getPointerTo(GlobalsAS); +#ifdef INTEL_SYCL_OPAQUEPOINTER_READY + llvm::Type *PtrTy = llvm::PointerType::get(CGM.getLLVMContext(), GlobalsAS); // vtable field is derived from `this` pointer, therefore they should be in // the same addr space. Note that this might not be LLVM address space 0. -#ifdef INTEL_SYCL_OPAQUEPOINTER_READY VTableField = VTableField.withElementType(PtrTy); #else VTableField = Builder.CreateElementBitCast(VTableField, VTablePtrTy); diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index ff7490e1c9eb1..b559de7e31c35 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -777,7 +777,9 @@ CGCallee ItaniumCXXABI::EmitLoadOfMemberFunctionPointer( CGM.getIntrinsic(llvm::Intrinsic::load_relative, {VTableOffset->getType()}), {VTable, VTableOffset}); +#ifndef INTEL_SYCL_OPAQUEPOINTER_READY VirtualFn = CGF.Builder.CreateBitCast(VirtualFn, FTy->getPointerTo()); +#endif } else { llvm::Value *VFPAddr = CGF.Builder.CreateGEP(CGF.Int8Ty, VTable, VTableOffset); @@ -2141,7 +2143,9 @@ CGCallee ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF, llvm::Value *Load = CGF.Builder.CreateCall( CGM.getIntrinsic(llvm::Intrinsic::load_relative, {CGM.Int32Ty}), {VTable, llvm::ConstantInt::get(CGM.Int32Ty, 4 * VTableIndex)}); +#ifndef INTEL_SYCL_OPAQUEPOINTER_READY VFuncLoad = CGF.Builder.CreateBitCast(Load, TyPtr); +#endif } else { VTable = CGF.Builder.CreateBitCast(VTable, TyPtr->getPointerTo()); diff --git a/llvm/include/llvm/IR/DerivedTypes.h b/llvm/include/llvm/IR/DerivedTypes.h index 46dac4189b92c..683a60c3c1858 100644 --- a/llvm/include/llvm/IR/DerivedTypes.h +++ b/llvm/include/llvm/IR/DerivedTypes.h @@ -645,9 +645,8 @@ class PointerType : public Type { #ifndef INTEL_SYCL_OPAQUEPOINTER_READY explicit PointerType(Type *ElType, unsigned AddrSpace); - - Type *PointeeTy; #endif // INTEL_SYCL_OPAQUEPOINTER_READY + Type *PointeeTy; public: PointerType(const PointerType &) = delete; diff --git a/llvm/include/llvm/IR/Intrinsics.h b/llvm/include/llvm/IR/Intrinsics.h index 21dbfdd172e36..5a8d3fe13ed9e 100644 --- a/llvm/include/llvm/IR/Intrinsics.h +++ b/llvm/include/llvm/IR/Intrinsics.h @@ -165,8 +165,7 @@ namespace Intrinsic { #ifdef INTEL_SYCL_OPAQUEPOINTER_READY assert(Kind == Argument || Kind == ExtendArgument || Kind == TruncArgument || Kind == HalfVecArgument || - Kind == SameVecWidthArgument || - Kind == PtrToElt || Kind == VecElementArgument || + Kind == SameVecWidthArgument || Kind == VecElementArgument || Kind == Subdivide2Argument || Kind == Subdivide4Argument || Kind == VecOfBitcastsToInt); #else diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td index d6666a7a6cba0..5d03ffb9d0f83 100644 --- a/llvm/include/llvm/IR/Intrinsics.td +++ b/llvm/include/llvm/IR/Intrinsics.td @@ -1909,14 +1909,22 @@ def int_vp_scatter: DefaultAttrsIntrinsic<[], // Experimental strided memory accesses def int_experimental_vp_strided_store : DefaultAttrsIntrinsic<[], [ llvm_anyvector_ty, +#ifdef INTEL_SYCL_OPAQUEPOINTER_READY + llvm_anyptr_ty, +#else LLVMAnyPointerToElt<0>, +#endif llvm_anyint_ty, // Stride in bytes LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>, llvm_i32_ty], [ NoCapture>, IntrNoSync, IntrWriteMem, IntrArgMemOnly, IntrWillReturn ]>; def int_experimental_vp_strided_load : DefaultAttrsIntrinsic<[llvm_anyvector_ty], +#ifdef INTEL_SYCL_OPAQUEPOINTER_READY + [ llvm_anyptr_ty, +#else [ LLVMAnyPointerToElt<0>, +#endif llvm_anyint_ty, // Stride in bytes LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>, llvm_i32_ty], diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index 245189a17bff8..d82ae8d972cd1 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -61,6 +61,7 @@ static std::string getTypeString(Type *T) { return Tmp.str(); } +#ifndef INTEL_SYCL_OPAQUEPOINTER_READY static void setContextOpaquePointers(LLLexer &L, LLVMContext &C) { while (true) { lltok::Kind K = L.Lex(); @@ -74,10 +75,11 @@ static void setContextOpaquePointers(LLLexer &L, LLVMContext &C) { } } } - +#endif /// Run: module ::= toplevelentity* bool LLParser::Run(bool UpgradeDebugInfo, DataLayoutCallbackTy DataLayoutCallback) { +#ifndef INTEL_SYCL_OPAQUEPOINTER_READY // If we haven't decided on whether or not we're using opaque pointers, do a // quick lex over the tokens to see if we explicitly construct any typed or // opaque pointer types. @@ -85,7 +87,7 @@ bool LLParser::Run(bool UpgradeDebugInfo, // regardless of if --opaque-pointers is set. if (!Context.hasSetOpaquePointersValue()) setContextOpaquePointers(OPLex, Context); - +#endif // Prime the lexer. Lex.Lex(); diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 5619dd2c262f1..f11c06b414856 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -2364,8 +2364,10 @@ Error BitcodeReader::parseTypeTableBody() { // [pointee type, address space] if (Record.empty()) return error("Invalid pointer record"); +#ifndef INTEL_SYCL_OPAQUEPOINTER_READY if (LLVM_UNLIKELY(!Context.hasSetOpaquePointersValue())) Context.setOpaquePointers(false); +#endif // INTEL_SYCL_OPAQUEPOINTER_READY unsigned AddressSpace = 0; if (Record.size() == 2) AddressSpace = Record[1]; diff --git a/llvm/lib/IR/LLVMContext.cpp b/llvm/lib/IR/LLVMContext.cpp index 0dbf19464bddc..991bccd47b69e 100644 --- a/llvm/lib/IR/LLVMContext.cpp +++ b/llvm/lib/IR/LLVMContext.cpp @@ -373,10 +373,11 @@ std::unique_ptr LLVMContext::getDiagnosticHandler() { return std::move(pImpl->DiagHandler); } +#ifndef INTEL_SYCL_OPAQUEPOINTER_READY bool LLVMContext::hasSetOpaquePointersValue() const { return pImpl->hasOpaquePointersValue(); } - +#endif void LLVMContext::setOpaquePointers(bool Enable) const { #ifdef INTEL_SYCL_OPAQUEPOINTER_READY assert(Enable && "Cannot disable opaque pointers"); diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 5e4373fdc417e..c1df5e1b3fc0f 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -2018,6 +2018,8 @@ void Verifier::verifyParameterAttrs(AttributeSet Attrs, Type *Ty, } } } +#else + } #endif // INTEL_SYCL_OPAQUEPOINTER_READY if (Attrs.hasAttribute(Attribute::NoFPClass)) { uint64_t Val = Attrs.getAttribute(Attribute::NoFPClass).getValueAsInt(); From ce2ff56c57ee06af2d36084e784d729e95cb2bb8 Mon Sep 17 00:00:00 2001 From: Jinsong Ji Date: Wed, 16 Aug 2023 09:08:36 -0700 Subject: [PATCH 2/5] Keep the addressspace cast for opaque pointer fa84874ea9c8 Added the cast , we should keep it in opaque pointer path. --- clang/lib/CodeGen/CGBuiltin.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 3bce12223cfc2..d0c1a1a695ab3 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -13102,7 +13102,8 @@ static Value *EmitX86MaskedStore(CodeGenFunction &CGF, ArrayRef Ops, Value *Ptr = CGF.Builder.CreatePointerBitCastOrAddrSpaceCast( Ops[0], llvm::PointerType::getUnqual(Ops[1]->getType())); #else // INTEL_SYCL_OPAQUEPOINTER_READY - Value *Ptr = Ops[0]; + Value *Ptr = CGF.Builder.CreateAddrSpaceCast( + Ops[0], llvm::PointerType::getUnqual(Ops[1]->getType())); #endif // INTEL_SYCL_OPAQUEPOINTER_READY Value *MaskVec = getMaskVecValue( @@ -13119,7 +13120,8 @@ static Value *EmitX86MaskedLoad(CodeGenFunction &CGF, ArrayRef Ops, Value *Ptr = CGF.Builder.CreatePointerBitCastOrAddrSpaceCast( Ops[0], llvm::PointerType::getUnqual(Ty)); #else // INTEL_SYCL_OPAQUEPOINTER_READY - Value *Ptr = Ops[0]; + Value *Ptr = CGF.Builder.CreateAddrSpaceCast( + Ops[0], llvm::PointerType::getUnqual(Ops[1]->getType())); #endif // INTEL_SYCL_OPAQUEPOINTER_READY Value *MaskVec = getMaskVecValue( From a119f9bb2584397db69b612307b79c76e9bc2688 Mon Sep 17 00:00:00 2001 From: Jinsong Ji Date: Wed, 16 Aug 2023 10:15:12 -0700 Subject: [PATCH 3/5] Fix opaque pointer guard for getVirtualFunctionPointer --- clang/lib/CodeGen/ItaniumCXXABI.cpp | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index b559de7e31c35..971f78cff9e96 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -2118,19 +2118,27 @@ CGCallee ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF, llvm::Type *Ty, SourceLocation Loc) { #ifdef INTEL_SYCL_OPAQUEPOINTER_READY - llvm::Type *TyPtr = CGM.GlobalsInt8PtrTy; + llvm::Type *PtrTy = CGM.GlobalsInt8PtrTy; #else // INTEL_SYCL_OPAQUEPOINTER_READY llvm::Type *TyPtr = Ty->getPointerTo(); #endif // INTEL_SYCL_OPAQUEPOINTER_READY auto *MethodDecl = cast(GD.getDecl()); +#ifdef INTEL_SYCL_OPAQUEPOINTER_READY + llvm::Value *VTable = CGF.GetVTablePtr(This, PtrTy, MethodDecl->getParent()); +#else llvm::Value *VTable = CGF.GetVTablePtr( This, TyPtr->getPointerTo(), MethodDecl->getParent()); +#endif uint64_t VTableIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(GD); llvm::Value *VFunc; if (CGF.ShouldEmitVTableTypeCheckedLoad(MethodDecl->getParent())) { VFunc = CGF.EmitVTableTypeCheckedLoad( +#ifdef INTEL_SYCL_OPAQUEPOINTER_READY + MethodDecl->getParent(), VTable, PtrTy, +#else MethodDecl->getParent(), VTable, TyPtr, +#endif VTableIndex * CGM.getContext().getTargetInfo().getPointerWidth(LangAS::Default) / 8); @@ -2139,14 +2147,25 @@ CGCallee ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF, llvm::Value *VFuncLoad; if (CGM.getItaniumVTableContext().isRelativeLayout()) { +#ifdef INTEL_SYCL_OPAQUEPOINTER_READY + VFuncLoad = CGF.Builder.CreateCall( + CGM.getIntrinsic(llvm::Intrinsic::load_relative, {CGM.Int32Ty}), + {VTable, llvm::ConstantInt::get(CGM.Int32Ty, 4 * VTableIndex)}); +#else VTable = CGF.Builder.CreateBitCast(VTable, CGM.Int8PtrTy); llvm::Value *Load = CGF.Builder.CreateCall( CGM.getIntrinsic(llvm::Intrinsic::load_relative, {CGM.Int32Ty}), {VTable, llvm::ConstantInt::get(CGM.Int32Ty, 4 * VTableIndex)}); -#ifndef INTEL_SYCL_OPAQUEPOINTER_READY + VFuncLoad = CGF.Builder.CreateBitCast(Load, TyPtr); #endif } else { +#ifdef INTEL_SYCL_OPAQUEPOINTER_READY + llvm::Value *VTableSlotPtr = CGF.Builder.CreateConstInBoundsGEP1_64( + PtrTy, VTable, VTableIndex, "vfn"); + VFuncLoad = CGF.Builder.CreateAlignedLoad(PtrTy, VTableSlotPtr, + CGF.getPointerAlign()); +#else VTable = CGF.Builder.CreateBitCast(VTable, TyPtr->getPointerTo()); llvm::Value *VTableSlotPtr = CGF.Builder.CreateConstInBoundsGEP1_64( @@ -2154,6 +2173,7 @@ CGCallee ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF, VFuncLoad = CGF.Builder.CreateAlignedLoad(TyPtr, VTableSlotPtr, CGF.getPointerAlign()); +#endif } // Add !invariant.load md to virtual function load to indicate that From c53d6d6137f52060a4bd1ca85b63a85568b3dd9f Mon Sep 17 00:00:00 2001 From: Jinsong Ji Date: Mon, 21 Aug 2023 13:06:26 -0400 Subject: [PATCH 4/5] Update clang/lib/CodeGen/ABIInfoImpl.cpp Co-authored-by: Mariya Podchishchaeva --- clang/lib/CodeGen/ABIInfoImpl.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/clang/lib/CodeGen/ABIInfoImpl.cpp b/clang/lib/CodeGen/ABIInfoImpl.cpp index 8717d993d2537..d786d51ca751e 100644 --- a/clang/lib/CodeGen/ABIInfoImpl.cpp +++ b/clang/lib/CodeGen/ABIInfoImpl.cpp @@ -202,10 +202,11 @@ CodeGen::emitVoidPtrDirectVAArg(CodeGenFunction &CGF, Address VAListAddr, #ifndef INTEL_SYCL_OPAQUEPOINTER_READY Addr = CGF.Builder.CreateElementBitCast(Addr, DirectTy); + return Addr; #else return Addr.withElementType(DirectTy); #endif - return Addr; + } Address CodeGen::emitVoidPtrVAArg(CodeGenFunction &CGF, Address VAListAddr, From 080938dd86d10266abe8e6640e858582e3f94a25 Mon Sep 17 00:00:00 2001 From: Jinsong Ji Date: Mon, 21 Aug 2023 14:29:16 -0700 Subject: [PATCH 5/5] fix clang-format error --- clang/lib/CodeGen/ABIInfoImpl.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/clang/lib/CodeGen/ABIInfoImpl.cpp b/clang/lib/CodeGen/ABIInfoImpl.cpp index d786d51ca751e..21568edb2b2df 100644 --- a/clang/lib/CodeGen/ABIInfoImpl.cpp +++ b/clang/lib/CodeGen/ABIInfoImpl.cpp @@ -206,7 +206,6 @@ CodeGen::emitVoidPtrDirectVAArg(CodeGenFunction &CGF, Address VAListAddr, #else return Addr.withElementType(DirectTy); #endif - } Address CodeGen::emitVoidPtrVAArg(CodeGenFunction &CGF, Address VAListAddr,