svn commit: r489257 - in branches/2019Q1/devel/llvm70: . files files/clang

Brooks Davis brooks at FreeBSD.org
Fri Jan 4 16:16:33 UTC 2019


Author: brooks
Date: Fri Jan  4 16:16:31 2019
New Revision: 489257
URL: https://svnweb.freebsd.org/changeset/ports/489257

Log:
  MFH: r489195 (reliability fix blanket)
  
  Backport two Objective-C bug fixes (D18672)
  
  Add patches for head rS342592 and rS342593 (D18691)
  
  Add patch files for head rS342592 and rS342593, which correspond to the
  following upstream revisions:
  
  https://reviews.llvm.org/rL342397
  https://reviews.llvm.org/rL342397
  
  These fix an 'Assertion failed: ((VT.getVectorNumElements() +
  N2C->getZExtValue() <= N1.getValueType().getVectorNumElements()) &&
  "Extract subvector overflow!"), function getNode' when building the
  multimedia/aom port (with AVX2 enabled).
  
  PR:		234480
  Submitted by:	theraven, dim
  Differential Revision:	https://reviews.freebsd.org/D18672
  Differential Revision:	https://reviews.freebsd.org/D18691
  Approved by:	ports-secteam (reliability fix blanket)

Added:
  branches/2019Q1/devel/llvm70/files/clang/patch-tools_clang_lib_CodeGen_CGObjCGNU.cpp
     - copied unchanged from r489195, head/devel/llvm70/files/clang/patch-tools_clang_lib_CodeGen_CGObjCGNU.cpp
  branches/2019Q1/devel/llvm70/files/patch-head-r342592.diff
     - copied unchanged from r489195, head/devel/llvm70/files/patch-head-r342592.diff
  branches/2019Q1/devel/llvm70/files/patch-head-r342593.diff
     - copied unchanged from r489195, head/devel/llvm70/files/patch-head-r342593.diff
Modified:
  branches/2019Q1/devel/llvm70/Makefile
Directory Properties:
  branches/2019Q1/   (props changed)

Modified: branches/2019Q1/devel/llvm70/Makefile
==============================================================================
--- branches/2019Q1/devel/llvm70/Makefile	Fri Jan  4 15:15:04 2019	(r489256)
+++ branches/2019Q1/devel/llvm70/Makefile	Fri Jan  4 16:16:31 2019	(r489257)
@@ -2,7 +2,7 @@
 
 PORTNAME=	llvm
 DISTVERSION=	7.0.1
-PORTREVISION=	0
+PORTREVISION=	1
 CATEGORIES=	devel lang
 MASTER_SITES=	http://${PRE_}releases.llvm.org/${LLVM_RELEASE}/${RCDIR}
 PKGNAMESUFFIX=	${LLVM_SUFFIX}

Copied: branches/2019Q1/devel/llvm70/files/clang/patch-tools_clang_lib_CodeGen_CGObjCGNU.cpp (from r489195, head/devel/llvm70/files/clang/patch-tools_clang_lib_CodeGen_CGObjCGNU.cpp)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/2019Q1/devel/llvm70/files/clang/patch-tools_clang_lib_CodeGen_CGObjCGNU.cpp	Fri Jan  4 16:16:31 2019	(r489257, copy of r489195, head/devel/llvm70/files/clang/patch-tools_clang_lib_CodeGen_CGObjCGNU.cpp)
@@ -0,0 +1,72 @@
+--- tools/clang/lib/CodeGen/CGObjCGNU.cpp.orig	2018-12-28 16:37:45 UTC
++++ tools/clang/lib/CodeGen/CGObjCGNU.cpp
+@@ -277,6 +277,8 @@ protected:
+     Fields.addInt(Int8Ty, 0);
+   }
+ 
++  virtual llvm::Constant *GenerateCategoryProtocolList(const
++      ObjCCategoryDecl *OCD);
+   virtual ConstantArrayBuilder PushPropertyListHeader(ConstantStructBuilder &Fields,
+       int count) {
+       // int count;
+@@ -1164,6 +1166,15 @@ class CGObjCGNUstep2 : public CGObjCGNUs
+     return MethodList.finishAndCreateGlobal(".objc_protocol_method_list",
+                                             CGM.getPointerAlign());
+   }
++  llvm::Constant *GenerateCategoryProtocolList(const ObjCCategoryDecl *OCD)
++    override {
++    SmallVector<llvm::Constant*, 16> Protocols;
++    for (const auto *PI : OCD->getReferencedProtocols())
++      Protocols.push_back(
++          llvm::ConstantExpr::getBitCast(GenerateProtocolRef(PI),
++            ProtocolPtrTy));
++    return GenerateProtocolList(Protocols);
++  }
+ 
+   llvm::Value *LookupIMPSuper(CodeGenFunction &CGF, Address ObjCSuper,
+                               llvm::Value *cmd, MessageSendInfo &MSI) override {
+@@ -1547,7 +1558,7 @@ class CGObjCGNUstep2 : public CGObjCGNUs
+             sectionName<CategorySection>());
+       if (!EmittedClass) {
+         createNullGlobal(".objc_null_cls_init_ref", NULLPtr,
+-            sectionName<ClassReferenceSection>());
++            sectionName<ClassSection>());
+         createNullGlobal(".objc_null_class_ref", { NULLPtr, NULLPtr },
+             sectionName<ClassReferenceSection>());
+       }
+@@ -3099,18 +3110,21 @@ llvm::Constant *CGObjCGNU::MakeBitField(
+   return ptr;
+ }
+ 
++llvm::Constant *CGObjCGNU::GenerateCategoryProtocolList(const
++    ObjCCategoryDecl *OCD) {
++  SmallVector<std::string, 16> Protocols;
++  for (const auto *PD : OCD->getReferencedProtocols())
++    Protocols.push_back(PD->getNameAsString());
++  return GenerateProtocolList(Protocols);
++}
++
+ void CGObjCGNU::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
+   const ObjCInterfaceDecl *Class = OCD->getClassInterface();
+   std::string ClassName = Class->getNameAsString();
+   std::string CategoryName = OCD->getNameAsString();
+ 
+   // Collect the names of referenced protocols
+-  SmallVector<std::string, 16> Protocols;
+   const ObjCCategoryDecl *CatDecl = OCD->getCategoryDecl();
+-  const ObjCList<ObjCProtocolDecl> &Protos = CatDecl->getReferencedProtocols();
+-  for (ObjCList<ObjCProtocolDecl>::iterator I = Protos.begin(),
+-       E = Protos.end(); I != E; ++I)
+-    Protocols.push_back((*I)->getNameAsString());
+ 
+   ConstantInitBuilder Builder(CGM);
+   auto Elements = Builder.beginStruct();
+@@ -3132,7 +3146,7 @@ void CGObjCGNU::GenerateCategory(const O
+           GenerateMethodList(ClassName, CategoryName, ClassMethods, true),
+           PtrTy);
+   // Protocol list
+-  Elements.addBitCast(GenerateProtocolList(Protocols), PtrTy);
++  Elements.addBitCast(GenerateCategoryProtocolList(CatDecl), PtrTy);
+   if (isRuntime(ObjCRuntime::GNUstep, 2)) {
+     const ObjCCategoryDecl *Category =
+       Class->FindCategoryDeclaration(OCD->getIdentifier());

Copied: branches/2019Q1/devel/llvm70/files/patch-head-r342592.diff (from r489195, head/devel/llvm70/files/patch-head-r342592.diff)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/2019Q1/devel/llvm70/files/patch-head-r342592.diff	Fri Jan  4 16:16:31 2019	(r489257, copy of r489195, head/devel/llvm70/files/patch-head-r342592.diff)
@@ -0,0 +1,106 @@
+r342592 | dim | 2018-12-29 16:13:49 +0100 (Sat, 29 Dec 2018) | 19 lines
+
+Pull in r342397 from upstream llvm trunk (by Amara Emerson):
+
+  Revert "Revert r342183 "[DAGCombine] Fix crash when store merging
+  created an extract_subvector with invalid index.""
+
+  Fixed the assertion failure.
+
+  Differential Revision: https://reviews.llvm.org/D51831
+
+This fixes 'Assertion failed: ((VT.getVectorNumElements() +
+N2C->getZExtValue() <= N1.getValueType().getVectorNumElements()) &&
+"Extract subvector overflow!"), function getNode' when building the
+multimedia/aom port (with AVX2 enabled).
+
+Reported by:	jbeich
+PR:		234480
+
+Index: lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+===================================================================
+--- lib/CodeGen/SelectionDAG/DAGCombiner.cpp	(revision 342591)
++++ lib/CodeGen/SelectionDAG/DAGCombiner.cpp	(revision 342592)
+@@ -13727,10 +13727,19 @@ bool DAGCombiner::MergeStoresOfConstantsOrVecElts(
+              Val.getOpcode() == ISD::EXTRACT_SUBVECTOR)) {
+           SDValue Vec = Val.getOperand(0);
+           EVT MemVTScalarTy = MemVT.getScalarType();
++          SDValue Idx = Val.getOperand(1);
+           // We may need to add a bitcast here to get types to line up.
+           if (MemVTScalarTy != Vec.getValueType()) {
+             unsigned Elts = Vec.getValueType().getSizeInBits() /
+                             MemVTScalarTy.getSizeInBits();
++            if (Val.getValueType().isVector() && MemVT.isVector()) {
++              unsigned IdxC = cast<ConstantSDNode>(Idx)->getZExtValue();
++              unsigned NewIdx =
++                  ((uint64_t)IdxC * MemVT.getVectorNumElements()) / Elts;
++              Idx = DAG.getConstant(NewIdx, SDLoc(Val), Idx.getValueType());
++            }
++            if (!MemVT.isVector() && Val.getValueType().isVector())
++              dbgs() << "hit!\n";
+             EVT NewVecTy =
+                 EVT::getVectorVT(*DAG.getContext(), MemVTScalarTy, Elts);
+             Vec = DAG.getBitcast(NewVecTy, Vec);
+@@ -13737,7 +13746,7 @@ bool DAGCombiner::MergeStoresOfConstantsOrVecElts(
+           }
+           auto OpC = (MemVT.isVector()) ? ISD::EXTRACT_SUBVECTOR
+                                         : ISD::EXTRACT_VECTOR_ELT;
+-          Val = DAG.getNode(OpC, SDLoc(Val), MemVT, Vec, Val.getOperand(1));
++          Val = DAG.getNode(OpC, SDLoc(Val), MemVT, Vec, Idx);
+         }
+         Ops.push_back(Val);
+       }
+Index: test/CodeGen/X86/merge-vector-stores-scale-idx-crash.ll
+===================================================================
+--- test/CodeGen/X86/merge-vector-stores-scale-idx-crash.ll	(nonexistent)
++++ test/CodeGen/X86/merge-vector-stores-scale-idx-crash.ll	(revision 342592)
+@@ -0,0 +1,49 @@
++; RUN: llc < %s  -mtriple=x86_64-apple-osx10.14 -mattr=+avx2 | FileCheck %s
++
++; Check that we don't crash due creating invalid extract_subvector indices in store merging.
++; CHECK-LABEL: testfn
++; CHECK: retq
++define void @testfn(i32* nocapture %p) {
++  %v0 = getelementptr i32, i32* %p, i64 12
++  %1 = bitcast i32* %v0 to <2 x i64>*
++  %2 = bitcast i32* %v0 to <4 x i32>*
++  %3 = getelementptr <2 x i64>, <2 x i64>* %1, i64 -3
++  store <2 x i64> undef, <2 x i64>* %3, align 16
++  %4 = shufflevector <4 x i64> zeroinitializer, <4 x i64> undef, <2 x i32> <i32 0, i32 1>
++  %5 = getelementptr <2 x i64>, <2 x i64>* %1, i64 -2
++  store <2 x i64> %4, <2 x i64>* %5, align 16
++  %6 = shufflevector <8 x i32> zeroinitializer, <8 x i32> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
++  %7 = getelementptr <4 x i32>, <4 x i32>* %2, i64 -1
++  store <4 x i32> %6, <4 x i32>* %7, align 16
++  ret void
++}
++
++%struct.o.1.5.7.9.13.15.17.19.57 = type { [0 x %struct.d.0.4.6.8.12.14.16.18.56] }
++%struct.d.0.4.6.8.12.14.16.18.56 = type { float, float }
++
++; CHECK-LABEL: testfn_scalar
++; CHECK: retq
++define void @testfn_scalar(%struct.o.1.5.7.9.13.15.17.19.57* nocapture %j) local_unnamed_addr #0 align 2 {
++entry:
++  %0 = bitcast i64 undef to <2 x float>
++  br i1 undef, label %if.end, label %if.then
++
++if.then:                                          ; preds = %entry
++  unreachable
++
++if.end:                                           ; preds = %entry
++  %call.i.i17 = tail call <4 x float> @_Z1bv()
++  %1 = bitcast <4 x float> %call.i.i17 to <2 x i64>
++  %extract.i.i15 = extractelement <2 x i64> %1, i64 0
++  %arrayidx6 = getelementptr inbounds %struct.o.1.5.7.9.13.15.17.19.57, %struct.o.1.5.7.9.13.15.17.19.57* %j, i64 0, i32 0, i64 1
++  %2 = bitcast %struct.d.0.4.6.8.12.14.16.18.56* %arrayidx6 to i64*
++  store i64 %extract.i.i15, i64* %2, align 4
++  %r.sroa.0.0..sroa_cast12 = bitcast %struct.o.1.5.7.9.13.15.17.19.57* %j to <2 x float>*
++  store <2 x float> %0, <2 x float>* %r.sroa.0.0..sroa_cast12, align 4
++  ret void
++}
++
++declare <4 x float> @_Z1bv() local_unnamed_addr 
++
++attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "min-legal-vector-width"="128" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
++

Copied: branches/2019Q1/devel/llvm70/files/patch-head-r342593.diff (from r489195, head/devel/llvm70/files/patch-head-r342593.diff)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/2019Q1/devel/llvm70/files/patch-head-r342593.diff	Fri Jan  4 16:16:31 2019	(r489257, copy of r489195, head/devel/llvm70/files/patch-head-r342593.diff)
@@ -0,0 +1,21 @@
+r342593 | dim | 2018-12-29 16:21:51 +0100 (Sat, 29 Dec 2018) | 8 lines
+
+Pull in r342863 from upstream llvm trunk (by Hans Wennborg):
+
+  Remove debug printf leftover from r342397
+
+PR:		234480
+
+Index: lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+===================================================================
+--- lib/CodeGen/SelectionDAG/DAGCombiner.cpp	(revision 342592)
++++ lib/CodeGen/SelectionDAG/DAGCombiner.cpp	(revision 342593)
+@@ -13738,8 +13738,6 @@ bool DAGCombiner::MergeStoresOfConstantsOrVecElts(
+                   ((uint64_t)IdxC * MemVT.getVectorNumElements()) / Elts;
+               Idx = DAG.getConstant(NewIdx, SDLoc(Val), Idx.getValueType());
+             }
+-            if (!MemVT.isVector() && Val.getValueType().isVector())
+-              dbgs() << "hit!\n";
+             EVT NewVecTy =
+                 EVT::getVectorVT(*DAG.getContext(), MemVTScalarTy, Elts);
+             Vec = DAG.getBitcast(NewVecTy, Vec);


More information about the svn-ports-all mailing list