Index: head/devel/intel-graphics-compiler/Makefile =================================================================== --- head/devel/intel-graphics-compiler/Makefile (revision 557287) +++ head/devel/intel-graphics-compiler/Makefile (revision 557288) @@ -1,55 +1,55 @@ # $FreeBSD$ PORTNAME= intel-graphics-compiler DISTVERSIONPREFIX= igc- -DISTVERSION= 1.0.5699 -PORTREVISION= 1 +DISTVERSION= 1.0.5761 CATEGORIES= devel PATCH_SITES= https://github.com/${GH_ACCOUNT}/${GH_PROJECT}/commit/ PATCHFILES+= d878880cbb3b.patch:-p1 # https://github.com/intel/intel-graphics-compiler/pull/129 PATCHFILES+= f44eb990ac84.patch:-p1 # https://github.com/intel/intel-graphics-compiler/pull/156 PATCHFILES+= cf887180a0e3.patch:-p1 # https://github.com/intel/intel-graphics-compiler/pull/156 +PATCHFILES+= 02d82a7ccbe6.patch:-p1 # https://github.com/intel/intel-graphics-compiler/pull/156 MAINTAINER= jbeich@FreeBSD.org COMMENT= Intel Graphics Compiler for OpenCL LICENSE= MIT LICENSE_FILE= ${WRKSRC}/LICENSE.md ONLY_FOR_ARCHS= amd64 i386 ONLY_FOR_ARCHS_REASON= Only Intel GPUs on x86 are supported LIB_DEPENDS= libopencl-clang.so:devel/opencl-clang USES= bison cmake compiler:c++17-lang python:build USE_GITHUB= yes USE_LDCONFIG= yes GH_ACCOUNT= intel GH_TUPLE= intel:vc-intrinsics:a08fe5b:vcintrin/../vc-intrinsics CMAKE_OFF= INSTALL_SPIRVDLL CFLAGS+= -Wno-macro-redefined # __fastcall PLIST_SUB= ARCH_SUFX=${ARCH:S/i386/32/:S/amd//:S/x86_//} post-patch: # lang/python* don't install unsuffixed symlinks @${REINPLACE_CMD} -i .python \ -e '/EXECUTABLE/s/"python"/"${PYTHON_CMD:T}"/' \ -e '/IGC_PYTHON/s/"python"/"${PYTHON_CMD:T}"/' \ ${WRKSRC}/IGC/CMakeLists.txt \ ${WRKSRC}/IGC/BiFModule/CMakeLists.txt # devel/llvm* have different naming from upstream under PATH @${REINPLACE_CMD} -e '/clang-\$$/s//clang$$/' \ ${WRKSRC}/IGC/BiFModule/CMakeLists.txt # No need to abort on every benign warning enabled by default @${REINPLACE_CMD} -e 's/"-Werror"//; /-Werror/d' \ ${WRKSRC}/IGC/CMakeLists.txt pre-configure: # Only one libLLVM can be loaded, so use the same version as devel/opencl-clang @for f in ${LOCALBASE}/lib/libopencl-clang.so.*; do \ ${REINPLACE_CMD} "/set.*LLVM_VERSION/s/\".*\"/\"$${f##*so.}\"/" \ ${WRKSRC}/IGC/CMakeLists.txt; \ done .include Index: head/devel/intel-graphics-compiler/distinfo =================================================================== --- head/devel/intel-graphics-compiler/distinfo (revision 557287) +++ head/devel/intel-graphics-compiler/distinfo (revision 557288) @@ -1,11 +1,13 @@ -TIMESTAMP = 1605927132 -SHA256 (intel-intel-graphics-compiler-igc-1.0.5699_GH0.tar.gz) = 9afa912d7671f45e70b2dcea61dde485ed4e16fe6018d27265d98e6680935688 -SIZE (intel-intel-graphics-compiler-igc-1.0.5699_GH0.tar.gz) = 7379486 +TIMESTAMP = 1606813350 +SHA256 (intel-intel-graphics-compiler-igc-1.0.5761_GH0.tar.gz) = 16f7b072f9f70c8e9d8f4d6ba6a9ce8f98834b82d7a73cbd5f717ea3f4dddb96 +SIZE (intel-intel-graphics-compiler-igc-1.0.5761_GH0.tar.gz) = 7117417 SHA256 (intel-vc-intrinsics-a08fe5b_GH0.tar.gz) = e57f05d56e385449ed86fdbbb3b5f75ba67537dce137176e371c30081c4fea2f SIZE (intel-vc-intrinsics-a08fe5b_GH0.tar.gz) = 119121 SHA256 (d878880cbb3b.patch) = f430b2da0d212594ce73f23b279a1435f08dea60f30ec35494411ab0dc0fcf70 SIZE (d878880cbb3b.patch) = 9088 SHA256 (f44eb990ac84.patch) = 4774683855caa8ef44a85a43356b7d509683bbdbef23e31ab6f5e4075715d67c SIZE (f44eb990ac84.patch) = 1547 SHA256 (cf887180a0e3.patch) = 20c5afc646f61180880fc8e07abcd0feac04bfb190ab27d8af939d459b61a9a0 SIZE (cf887180a0e3.patch) = 4191 +SHA256 (02d82a7ccbe6.patch) = 396198830fb7e55318a870d46e93d93aaa5dca90a7979e3b3f7afcca965f1938 +SIZE (02d82a7ccbe6.patch) = 1292 Index: head/devel/intel-graphics-compiler/files/patch-revert =================================================================== --- head/devel/intel-graphics-compiler/files/patch-revert (revision 557287) +++ head/devel/intel-graphics-compiler/files/patch-revert (revision 557288) @@ -1,353 +1,362 @@ https://github.com/intel/intel-graphics-compiler/issues/155 ---- IGC/Compiler/CISACodeGen/ResolveGAS.cpp.orig 2020-11-13 09:31:31 UTC +--- IGC/Compiler/CISACodeGen/ResolveGAS.cpp.orig 2020-12-01 09:02:30 UTC +++ IGC/Compiler/CISACodeGen/ResolveGAS.cpp @@ -35,7 +35,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "llvm/Support/Debug.h" #include "llvmWrapper/IR/Constant.h" #include -#include #include #include #include @@ -80,8 +79,6 @@ namespace { void getAnalysisUsage(AnalysisUsage& AU) const override { AU.setPreservesCFG(); AU.addRequired(); - AU.addRequired(); - AU.addRequired(); } bool isResolvableLoopPHI(PHINode* PN) const { @@ -92,17 +89,11 @@ namespace { bool resolveOnFunction(Function*) const; bool resolveOnBasicBlock(BasicBlock*) const; - bool resolveMemoryFromHost(Function&) const; - void populateResolvableLoopPHIs(); void populateResolvableLoopPHIsForLoop(const Loop*); bool isAddrSpaceResolvable(PHINode* PN, const Loop* L, BasicBlock* BackEdge) const; - - bool checkGenericArguments(Function& F) const; - void convertLoadToGlobal(LoadInst* LI) const; - bool isLoadGlobalCandidate(LoadInst* LI) const; }; class GASPropagator : public InstVisitor { @@ -157,8 +148,6 @@ namespace IGC { IGC_INITIALIZE_PASS_BEGIN(GASResolving, PASS_FLAG, PASS_DESC, PASS_CFG_ONLY, PASS_ANALYSIS) IGC_INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) - IGC_INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass) - IGC_INITIALIZE_PASS_DEPENDENCY(MetaDataUtilsWrapper) IGC_INITIALIZE_PASS_END(GASResolving, PASS_FLAG, PASS_DESC, PASS_CFG_ONLY, PASS_ANALYSIS) } @@ -169,8 +158,6 @@ bool GASResolving::runOnFunction(Function& F) { IRB = &TheBuilder; Propagator = &ThePropagator; - resolveMemoryFromHost(F); - populateResolvableLoopPHIs(); bool Changed = false; -@@ -687,175 +674,5 @@ bool GASPropagator::visitCallInst(CallInst& I) { +@@ -716,177 +703,5 @@ bool GASPropagator::visitCallInst(CallInst& I) { return true; } - return false; -} - -bool GASResolving::resolveMemoryFromHost(Function& F) const { - MetaDataUtils* pMdUtils = getAnalysis().getMetaDataUtils(); - - // skip all non-entry functions - if (!isEntryFunc(pMdUtils, &F)) - return false; - - // early check in order not to iterate whole function - if (!checkGenericArguments(F)) - return false; - - SmallVector Stores; - SmallVector Loads; - AliasAnalysis* AA = &getAnalysis().getAAResults(); - - // collect load candidates and in parallel check for unsafe instructions - // visitor may be a more beautiful way to do this - bool HasASCast = false; // if there exists addrspace cast from non global/generic space - bool HasPtoi = false; // if there exists ptrtoint with global/generic space - for (BasicBlock& B : F) { - for (Instruction& I : B) { - if (auto LI = dyn_cast(&I)) { - if (isLoadGlobalCandidate(LI)) { - Loads.push_back(LI); - } - } - else if (auto CI = dyn_cast(&I)) { - if (CI->onlyReadsMemory()) - continue; - - // currently recognize only these ones - // in fact intrinsics should be marked as read-only - if (auto II = dyn_cast(CI)) { - if (II->getIntrinsicID() == Intrinsic::lifetime_start || - II->getIntrinsicID() == Intrinsic::lifetime_end) - continue; - } - - // if we have an unsafe call in the kernel, abort - // to improve we can collect arguments of writing calls as memlocations for alias analysis - return false; - } - else if (auto PI = dyn_cast(&I)) { - // if we have a ptrtoint we need to check data flow which we don't want to - if (PI->getPointerAddressSpace() != ADDRESS_SPACE_GLOBAL && - PI->getPointerAddressSpace() != ADDRESS_SPACE_GENERIC) - return false; - else { - HasPtoi = true; - } - - return false; - } - else if (auto AI = dyn_cast(&I)) { - if (AI->getSrcAddressSpace() != ADDRESS_SPACE_GLOBAL && - AI->getSrcAddressSpace() != ADDRESS_SPACE_GENERIC) { - HasASCast = true; - } - } - else if (auto SI = dyn_cast(&I)) { - Value* V = SI->getValueOperand(); - if (isa(V->getType())) { - // this store can potentially write non-global pointer to memory - Stores.push_back(SI); - } - } - else if (I.mayWriteToMemory()) { - // unsupported instruction poisoning memory - return false; - } - } - } - if (HasASCast && HasPtoi) - return false; - - if (Loads.empty()) - return false; - - bool Changed = false; - while (!Loads.empty()) - { - LoadInst* LI = Loads.pop_back_val(); - - // check that we don't have aliasing stores for this load - // we expect to have basic and addrspace AA available at the moment - // on optimization phase - bool aliases = false; - for (auto SI : Stores) { - if (AA->alias(MemoryLocation::get(SI), MemoryLocation::get(LI))) { - aliases = true; - break; - } - } - if (aliases) - continue; - - convertLoadToGlobal(LI); - Changed = true; - } - return Changed; -} - -bool GASResolving::isLoadGlobalCandidate(LoadInst* LI) const { - // first check that loaded address has generic address space - // otherwise it is not our candidate - PointerType* PtrTy = dyn_cast(LI->getType()); - if (!PtrTy || PtrTy->getAddressSpace() != ADDRESS_SPACE_GENERIC) - return false; - - // next check that it is a load from function argument + offset - // which is necessary to prove that this address has global addrspace - Value* LoadBase = LI->getPointerOperand()->stripInBoundsOffsets(); +- // WA for gep not_inbounds base, 0, 0 that is not handled in stripoffsets +- LoadBase = LoadBase->stripPointerCasts(); - if (!isa(LoadBase)) - return false; - - // don't want to process cases when argument is from local address space - auto LoadTy = cast(LoadBase->getType()); - if (LoadTy->getAddressSpace() != ADDRESS_SPACE_GLOBAL) - return false; - - // TODO: skip cases that have been fixed on previous traversals - - return true; -} - -void GASResolving::convertLoadToGlobal(LoadInst* LI) const { - // create two addressspace casts: generic -> global -> generic - // the next scalar phase of this pass will propagate global to all uses of the load - - PointerType* PtrTy = cast(LI->getType()); - IRB->SetInsertPoint(LI->getNextNode()); - PointerType* GlobalPtrTy = PointerType::get(PtrTy->getElementType(), ADDRESS_SPACE_GLOBAL); - Value* GlobalAddr = IRB->CreateAddrSpaceCast(LI, GlobalPtrTy); - Value* GenericCopyAddr = IRB->CreateAddrSpaceCast(GlobalAddr, PtrTy); - - for (auto UI = LI->use_begin(), UE = LI->use_end(); UI != UE; /*EMPTY*/) { - Use& U = *UI++; - if (U.getUser() == GlobalAddr) - continue; - U.set(GenericCopyAddr); - } -} - -bool GASResolving::checkGenericArguments(Function& F) const { - // check that we have a pointer to pointer or pointer to struct that has pointer elements - // and main pointer type is global while underlying pointer type is generic - - auto* FT = F.getFunctionType(); - for (unsigned p = 0; p < FT->getNumParams(); ++p) { - if (auto Ty = dyn_cast(FT->getParamType(p))) { - if (Ty->getAddressSpace() != ADDRESS_SPACE_GLOBAL) - continue; - auto PteeTy = Ty->getElementType(); - if (auto PTy = dyn_cast(PteeTy)) { - if (PTy->getAddressSpace() == ADDRESS_SPACE_GENERIC) - return true; - } - if (auto STy = dyn_cast(PteeTy)) { - for (unsigned e = 0; e < STy->getNumElements(); ++e) { - if (auto ETy = dyn_cast(STy->getElementType(e))) { - if (ETy->getAddressSpace() == ADDRESS_SPACE_GENERIC) - return true; - } - } - } - } - } return false; } +\ No newline at end of file --- IGC/VectorCompiler/lib/GenXOpts/CMPacketize/GenXPacketize.cpp.orig 2020-11-13 09:31:31 UTC +++ IGC/VectorCompiler/lib/GenXOpts/CMPacketize/GenXPacketize.cpp @@ -276,7 +276,7 @@ Function *GenXPacketize::vectorizeSIMTFunction(Functio VecFName + Suffix[Width / 8], F->getParent()); ClonedFunc->setCallingConv(F->getCallingConv()); ClonedFunc->setAttributes(F->getAttributes()); - ClonedFunc->setAlignment(IGCLLVM::getAlign(*F)); + ClonedFunc->setAlignment(IGCLLVM::getAlign(F->getAlignment())); // then use CloneFunctionInto ValueToValueMapTy ArgMap; @@ -888,8 +888,10 @@ Value *GenXPacketize::packetizeLLVMInstruction(Instruc ->isPointerTy()); auto Align = LI->getAlignment(); pReplacedInst = B->MASKED_GATHER(pVecSrc, Align); - } else - pReplacedInst = B->ALIGNED_LOAD(pVecSrc, IGCLLVM::getAlign(*LI)); + } else { + auto Align = LI->getAlignment(); + pReplacedInst = B->ALIGNED_LOAD(pVecSrc, Align); + } break; } --- IGC/VectorCompiler/lib/GenXOpts/CMPacketize/gen_builder.hpp.orig 2020-11-13 09:31:31 UTC +++ IGC/VectorCompiler/lib/GenXOpts/CMPacketize/gen_builder.hpp @@ -573,24 +573,24 @@ StoreInst* STORE(Value *Val, Value *Ptr, bool isVolati return IRB()->CreateStore(Val, Ptr, isVolatile); } -inline LoadInst* ALIGNED_LOAD(Value *Ptr, IGCLLVM::Align Align, const char *Name) +LoadInst* ALIGNED_LOAD(Value *Ptr, unsigned Align, const char *Name) { - return IRB()->CreateAlignedLoad(Ptr, Align, Name); + return IRB()->CreateAlignedLoad(Ptr, IGCLLVM::getAlign(Align), Name); } -inline LoadInst* ALIGNED_LOAD(Value *Ptr, IGCLLVM::Align Align, const Twine &Name = "") +LoadInst* ALIGNED_LOAD(Value *Ptr, unsigned Align, const Twine &Name = "") { - return IRB()->CreateAlignedLoad(Ptr, Align, Name); + return IRB()->CreateAlignedLoad(Ptr, IGCLLVM::getAlign(Align), Name); } -inline LoadInst* ALIGNED_LOAD(Value *Ptr, IGCLLVM::Align Align, bool isVolatile, const Twine &Name = "") +LoadInst* ALIGNED_LOAD(Value *Ptr, unsigned Align, bool isVolatile, const Twine &Name = "") { - return IRB()->CreateAlignedLoad(Ptr, Align, isVolatile, Name); + return IRB()->CreateAlignedLoad(Ptr, IGCLLVM::getAlign(Align), isVolatile, Name); } -inline StoreInst* ALIGNED_STORE(Value *Val, Value *Ptr, IGCLLVM::Align Align, bool isVolatile = false) +StoreInst* ALIGNED_STORE(Value *Val, Value *Ptr, unsigned Align, bool isVolatile = false) { - return IRB()->CreateAlignedStore(Val, Ptr, Align, isVolatile); + return IRB()->CreateAlignedStore(Val, Ptr, IGCLLVM::getAlign(Align), isVolatile); } FenceInst* FENCE(AtomicOrdering Ordering, SyncScope::ID SSID = SyncScope::System, const Twine &Name = "") ---- IGC/WrapperLLVM/include/llvmWrapper/Support/Alignment.h.orig 2020-11-13 09:31:31 UTC +--- IGC/WrapperLLVM/include/llvmWrapper/Support/Alignment.h.orig 2020-12-01 09:02:30 UTC +++ IGC/WrapperLLVM/include/llvmWrapper/Support/Alignment.h -@@ -63,36 +63,48 @@ namespace IGCLLVM { +@@ -63,16 +63,16 @@ namespace IGCLLVM { inline llvm::Align getAlignmentValueIfNeeded(llvm::Align A) { return A; } #endif - using Align = + template= 11 - llvm::Align; + llvm::Align #endif - - inline Align getCorrectAlign(uint32_t Val) + > + inline T getCorrectAlign(uint32_t Val) { + if (Val == 0) + { +@@ -80,25 +80,37 @@ namespace IGCLLVM { + // Instead assume byte-align. + Val = 1; + } - return Align{ Val }; + return T{ Val }; } // It is meant for copying alignement. // getAlign returns different type for different LLVM versions but // it can be overcome by using auto or direct usage in another LLVM // interface. +#if LLVM_VERSION_MAJOR <= 9 template ::value, int> = 0> - Align getAlign(const TValue &Val) + unsigned getAlign(const TValue &Val) { -#if LLVM_VERSION_MAJOR <= 9 return Val.getAlignment(); + } #elif LLVM_VERSION_MAJOR <= 10 + template ::value, int> = 0> + llvm::MaybeAlign getAlign(const TValue &Val) + { + // LLVM 10 instructions accept MaybeAlign but do not provide + // getMaybeAlignMethod return llvm::MaybeAlign(Val.getAlignment()); + } #else + template ::value, int> = 0> + llvm::Align getAlign(const TValue &Val) + { return Val.getAlign(); -#endif } +#endif } // namespace IGCLLVM Index: head/lang/intel-compute-runtime/Makefile =================================================================== --- head/lang/intel-compute-runtime/Makefile (revision 557287) +++ head/lang/intel-compute-runtime/Makefile (revision 557288) @@ -1,63 +1,64 @@ # $FreeBSD$ PORTNAME= compute-runtime DISTVERSION= 20.48.18558 +PORTREVISION= 1 CATEGORIES= lang PKGNAMEPREFIX= intel- PATCH_SITES= https://github.com/${GH_ACCOUNT}/${GH_PROJECT}/commit/ PATCHFILES+= 2a423820aaa4.patch:-p1 # https://github.com/intel/compute-runtime/pull/361 MAINTAINER= jbeich@FreeBSD.org COMMENT= OpenCL implementation for Intel HD 5000 (Gen8) or newer LICENSE= MIT LICENSE_FILE= ${WRKSRC}/LICENSE ONLY_FOR_ARCHS= amd64 i386 ONLY_FOR_ARCHS_REASON= Only Intel GPUs on x86 are supported LIB_DEPENDS= libigc.so:devel/intel-graphics-compiler \ libigdgmm.so:multimedia/gmmlib USES= cmake compiler:c++14-lang localbase:ldflags pkgconfig USE_GITHUB= yes USE_LDCONFIG= yes GH_ACCOUNT= intel CMAKE_ON= SKIP_UNIT_TESTS SUPPORT_DG1 CMAKE_ARGS= -DNEO_OCL_DRIVER_VERSION:STRING="${DISTVERSIONFULL}" PLIST_FILES= bin/ocloc \ etc/OpenCL/vendors/intel.icd \ include/ocloc_api.h \ lib/intel-opencl/libigdrcl.so \ lib/libocloc.so \ ${NULL} OPTIONS_DEFINE= VAAPI OPTIONS_DEFAULT=VAAPI OPTIONS_DEFINE_amd64= L0 OPTIONS_DEFAULT_amd64= L0 L0_DESC= oneAPI Level Zero support L0_BUILD_DEPENDS= level-zero>=1.0:devel/level-zero L0_CMAKE_BOOL= BUILD_WITH_L0 L0_CMAKE_ON= -DNEO_VERSION_BUILD:STRING="0" L0_PLIST_FILES= lib/libze_intel_gpu.so.1 \ lib/libze_intel_gpu.so.1.0.0 VAAPI_BUILD_DEPENDS= ${LOCALBASE}/include/va/va.h:multimedia/libva VAAPI_CMAKE_BOOL_OFF= DISABLE_LIBVA post-patch: @${REINPLACE_CMD} -e '/-Werror/d' \ -e '/FORCE_RESPONSE_FILE/d' \ ${WRKSRC}/CMakeLists.txt @${REINPLACE_CMD} -e '/OCL_ICD_VENDORDIR/s,/etc,${PREFIX}&,' \ ${WRKSRC}/package.cmake post-install: # install/strip has no effect on install(FILES), so strip manually ${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/* ${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/intel-opencl/*.so .include