From 703b033a0d4d2f555cd7fea35c9634aa5786585a Mon Sep 17 00:00:00 2001 From: Lukasz Wesierski Date: Thu, 20 Dec 2018 19:40:49 +0100 Subject: [PATCH] When switched to llvm7.0 a test based an OCL benchmark cannot be compiled. IGC crashes with such output: Assertion failed: isAllocaPromotable(AI) && "Cannot promote non-promotable alloca!", file llvm\src\lib\transforms\utils\promotememorytoregister.cpp, line 563 It's asserted in SROA optimization pass due to inappropriate bitcast creation for a new slice allocated. Later when doing memory-to-reg checking it detects that inserted bitcast is invalid. Change-Id: I4e0d596a76e58fc9a7e811d355094ac3249db922 --- .../fix-pointer-for-lifetime-intrinsic.patch | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 releases/7.0.0/patches_external/fix-pointer-for-lifetime-intrinsic.patch diff --git a/releases/7.0.0/patches_external/fix-pointer-for-lifetime-intrinsic.patch b/releases/7.0.0/patches_external/fix-pointer-for-lifetime-intrinsic.patch new file mode 100644 index 0000000..007b738 --- /dev/null +++ b/releases/7.0.0/patches_external/fix-pointer-for-lifetime-intrinsic.patch @@ -0,0 +1,23 @@ +diff -Naur a/lib/Transforms/Scalar/SROA.cpp b/lib/Transforms/Scalar/SROA.cpp +--- a/lib/Transforms/Scalar/SROA.cpp 2018-08-31 17:53:05.000000000 +0200 ++++ b/lib/Transforms/Scalar/SROA.cpp 2018-12-20 18:48:12.788662000 +0100 +@@ -3033,7 +3033,18 @@ + ConstantInt *Size = + ConstantInt::get(cast(II.getArgOperand(0)->getType()), + NewEndOffset - NewBeginOffset); +- Value *Ptr = getNewAllocaSlicePtr(IRB, OldPtr->getType()); ++ // For lifetime intrinsics it's ok to cast a pointer type of a new slice ++ // to a generic i8* pointer. There is a case when using the pointer type ++ // from whole alloca leads to an assertion in PromoteMemToReg. ++ // ++ // A patch is posted to fix this in LLVM: ++ // ++ // https://reviews.llvm.org/D55934 ++ // [PATCH] D55934: Assertion in isAllocaPromotable due to extra bitcast ++ // goes into lifetime marker ++ Type *PointerTy = IRB.getInt8PtrTy(OldPtr->getType()->getPointerAddressSpace()); ++ Value *Ptr = getNewAllocaSlicePtr(IRB, PointerTy); ++ + Value *New; + if (II.getIntrinsicID() == Intrinsic::lifetime_start) + New = IRB.CreateLifetimeStart(Ptr, Size);