git: f67260aafd1c - main - devel/llvm15: arm fixes, lite default change

From: Brooks Davis <brooks_at_FreeBSD.org>
Date: Mon, 19 Jun 2023 18:44:20 UTC
The branch main has been updated by brooks:

URL: https://cgit.FreeBSD.org/ports/commit/?id=f67260aafd1cfb5eb91cfc72df80a00ef8b87e13

commit f67260aafd1cfb5eb91cfc72df80a00ef8b87e13
Author:     Brooks Davis <brooks@FreeBSD.org>
AuthorDate: 2023-06-19 18:44:05 +0000
Commit:     Brooks Davis <brooks@FreeBSD.org>
CommitDate: 2023-06-19 18:44:05 +0000

    devel/llvm15: arm fixes, lite default change
    
    Change the lite flavor to default to BE_FREEBSD rather than BE_NATIVE to
    allow its use in cross-build CI pipelines.
    
    Backport fix for LLVM bug 61396. [0]  This fixes miscompilation of gcc
    on 32-bit arm.
    
    Remove an obsolete patch which breaks arm64. [1]
    
    PR:             271992 [0], 271616 [1]
    Reported by:    jfc@mit.edu [0,1]
---
 devel/llvm15/Makefile                       |  4 +-
 devel/llvm15/files/patch-backport-962c306a1 | 42 +++++++++++++
 devel/llvm15/files/patch-freebsd-r352318    | 93 -----------------------------
 3 files changed, 44 insertions(+), 95 deletions(-)

diff --git a/devel/llvm15/Makefile b/devel/llvm15/Makefile
index 7a5ba01e3dd9..8fc1fc372b0c 100644
--- a/devel/llvm15/Makefile
+++ b/devel/llvm15/Makefile
@@ -1,6 +1,6 @@
 PORTNAME=	llvm
 DISTVERSION=	15.0.7
-PORTREVISION=	3
+PORTREVISION=	4
 CATEGORIES=	devel lang
 MASTER_SITES=	https://github.com/llvm/llvm-project/releases/download/llvmorg-${DISTVERSION:S/rc/-rc/}/ \
 		https://${PRE_}releases.llvm.org/${LLVM_RELEASE}${RCDIR}/
@@ -97,7 +97,7 @@ OPTIONS_SINGLE_BACKENDS=BE_FREEBSD BE_NATIVE BE_STANDARD
 OPTIONS_SUB=	yes
 
 .if ${FLAVOR:Mlite}
-OPTIONS_DEFAULT+=	BE_NATIVE
+OPTIONS_DEFAULT+=	BE_FREEBSD
 .else
 OPTIONS_DEFINE+=	EXTRAS FLANG LIT LLDB MLIR OPENMP PYCLANG
 OPTIONS_DEFINE_aarch64=	OPENMP
diff --git a/devel/llvm15/files/patch-backport-962c306a1 b/devel/llvm15/files/patch-backport-962c306a1
new file mode 100644
index 000000000000..1b37decff88b
--- /dev/null
+++ b/devel/llvm15/files/patch-backport-962c306a1
@@ -0,0 +1,42 @@
+commit 8e1222aee4c657e572b7d7841daf7f48ec6ba035
+Author: John F. Carr <jfc@mit.edu>
+Date:   Tue Jun 13 14:10:00 2023 -0400
+
+    LLVM commit 962c306a11d0a21c884c12e18825b8a41ba1bd7d
+
+diff --git a/contrib/llvm-project/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/contrib/llvm-project/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+index 5fd4e45d80fb..9d95cb25efa0 100644
+--- llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
++++ llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+@@ -4627,11 +4627,17 @@ void LoopVectorizationCostModel::collectLoopUniforms(ElementCount VF) {
+             WideningDecision == CM_Interleave);
+   };
+ 
+-
+   // Returns true if Ptr is the pointer operand of a memory access instruction
+-  // I, and I is known to not require scalarization.
++  // I, I is known to not require scalarization, and the pointer is not also
++  // stored.
+   auto isVectorizedMemAccessUse = [&](Instruction *I, Value *Ptr) -> bool {
+-    return getLoadStorePointerOperand(I) == Ptr && isUniformDecision(I, VF);
++    auto GetStoredValue = [I]() -> Value * {
++      if (!isa<StoreInst>(I))
++        return nullptr;
++      return I->getOperand(0);
++    };
++    return getLoadStorePointerOperand(I) == Ptr && isUniformDecision(I, VF) &&
++           GetStoredValue() != Ptr;
+   };
+ 
+   // Holds a list of values which are known to have at least one uniform use.
+@@ -4679,8 +4685,8 @@ void LoopVectorizationCostModel::collectLoopUniforms(ElementCount VF) {
+       if (isa<LoadInst>(I) && Legal->isUniformMemOp(I))
+         addToWorklistIfAllowed(&I);
+ 
+-      if (isUniformDecision(&I, VF)) {
+-        assert(isVectorizedMemAccessUse(&I, Ptr) && "consistency check");
++      if (isVectorizedMemAccessUse(&I, Ptr)) {
++        assert(isUniformDecision(&I, VF) && "consistency check");
+         HasUniformUse.insert(Ptr);
+       }
+     }
diff --git a/devel/llvm15/files/patch-freebsd-r352318 b/devel/llvm15/files/patch-freebsd-r352318
deleted file mode 100644
index 4fe5c836b6ea..000000000000
--- a/devel/llvm15/files/patch-freebsd-r352318
+++ /dev/null
@@ -1,93 +0,0 @@
-commit 24b1a5b926832f68fa0a008b2484d4b44f58ee8e
-Author: dim <dim@FreeBSD.org>
-Date:   Sat Sep 14 10:55:33 2019 +0000
-
-    Revert commit from upstream llvm trunk (by Hans Wennborg):
-    
-      Re-commit r357452 (take 3): "SimplifyCFG
-      SinkCommonCodeFromPredecessors: Also sink function calls without used
-      results (PR41259)"
-    
-      Third time's the charm.
-    
-      This was reverted in r363220 due to being suspected of an internal
-      benchmark regression and a test failure, none of which turned out to
-      be caused by this.
-    
-    As reported in https://bugs.llvm.org/show_bug.cgi?id=43269, this causes
-    UNREACHABLE errors when compiling if_malo_pci.c for arm and aarch64.
-
-Notes:
-    svn path=/projects/clang900-import/; revision=352318
-
-diff --git lib/Transforms/Utils/SimplifyCFG.cpp lib/Transforms/Utils/SimplifyCFG.cpp
-index 11651d040dc0..6e2ef67408d9 100644
---- llvm/lib/Transforms/Utils/SimplifyCFG.cpp
-+++ llvm/lib/Transforms/Utils/SimplifyCFG.cpp
-@@ -1428,10 +1428,9 @@ static bool HoistThenElseCodeToIf(BranchInst *BI,
- static bool canSinkInstructions(
-     ArrayRef<Instruction *> Insts,
-     DenseMap<Instruction *, SmallVector<Value *, 4>> &PHIOperands) {
--  // Prune out obviously bad instructions to move. Each instruction must have
--  // exactly zero or one use, and we check later that use is by a single, common
--  // PHI instruction in the successor.
--  bool HasUse = !Insts.front()->user_empty();
-+  // Prune out obviously bad instructions to move. Any non-store instruction
-+  // must have exactly one use, and we check later that use is by a single,
-+  // common PHI instruction in the successor.
-   for (auto *I : Insts) {
-     // These instructions may change or break semantics if moved.
-     if (isa<PHINode>(I) || I->isEHPad() || isa<AllocaInst>(I) ||
-@@ -1445,10 +1444,9 @@ static bool canSinkInstructions(
-       if (C->isInlineAsm())
-         return false;
- 
--    // Each instruction must have zero or one use.
--    if (HasUse && !I->hasOneUse())
--      return false;
--    if (!HasUse && !I->user_empty())
-+    // Everything must have only one use too, apart from stores which
-+    // have no uses.
-+    if (!isa<StoreInst>(I) && !I->hasOneUse())
-       return false;
-   }
- 
-@@ -1457,11 +1455,11 @@ static bool canSinkInstructions(
-     if (!I->isSameOperationAs(I0))
-       return false;
- 
--  // All instructions in Insts are known to be the same opcode. If they have a
--  // use, check that the only user is a PHI or in the same block as the
--  // instruction, because if a user is in the same block as an instruction we're
--  // contemplating sinking, it must already be determined to be sinkable.
--  if (HasUse) {
-+  // All instructions in Insts are known to be the same opcode. If they aren't
-+  // stores, check the only user of each is a PHI or in the same block as the
-+  // instruction, because if a user is in the same block as an instruction
-+  // we're contemplating sinking, it must already be determined to be sinkable.
-+  if (!isa<StoreInst>(I0)) {
-     auto *PNUse = dyn_cast<PHINode>(*I0->user_begin());
-     auto *Succ = I0->getParent()->getTerminator()->getSuccessor(0);
-     if (!all_of(Insts, [&PNUse,&Succ](const Instruction *I) -> bool {
-@@ -1539,7 +1537,7 @@ static bool sinkLastInstruction(ArrayRef<BasicBlock*> Blocks) {
-   // it is slightly over-aggressive - it gets confused by commutative instructions
-   // so double-check it here.
-   Instruction *I0 = Insts.front();
--  if (!I0->user_empty()) {
-+  if (!isa<StoreInst>(I0)) {
-     auto *PNUse = dyn_cast<PHINode>(*I0->user_begin());
-     if (!all_of(Insts, [&PNUse](const Instruction *I) -> bool {
-           auto *U = cast<Instruction>(*I->user_begin());
-@@ -1597,10 +1595,11 @@ static bool sinkLastInstruction(ArrayRef<BasicBlock*> Blocks) {
-       I0->andIRFlags(I);
-     }
- 
--  if (!I0->user_empty()) {
-+  if (!isa<StoreInst>(I0)) {
-     // canSinkLastInstruction checked that all instructions were used by
-     // one and only one PHI node. Find that now, RAUW it to our common
-     // instruction and nuke it.
-+    assert(I0->hasOneUse());
-     auto *PN = cast<PHINode>(*I0->user_begin());
-     PN->replaceAllUsesWith(I0);
-     PN->eraseFromParent();