git: ab467871db40 - main - devel/llvm12: fix/workaround liblzma incorrect compress/uncompress

From: Piotr Kubaj <pkubaj_at_FreeBSD.org>
Date: Fri, 22 Oct 2021 12:09:18 UTC
The branch main has been updated by pkubaj:

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

commit ab467871db4051ab0162256fccdfe872ae40b959
Author:     Piotr Kubaj <pkubaj@FreeBSD.org>
AuthorDate: 2021-10-22 11:42:42 +0000
Commit:     Piotr Kubaj <pkubaj@FreeBSD.org>
CommitDate: 2021-10-22 11:42:42 +0000

    devel/llvm12: fix/workaround liblzma incorrect compress/uncompress
    
    Apply https://reviews.freebsd.org/D31804
    
    Fixes miscompiling liblzma.
    
    Submitted by:   adalava
---
 ...lvm_include_llvm_Analysis_TargetTransformInfo.h | 10 +++
 ...patch-llvm_lib_Analysis_TargetTransformInfo.cpp | 14 ++++
 .../files/patch-llvm_lib_CodeGen_HardwareLoops.cpp | 75 ++++++++++++++++++++++
 3 files changed, 99 insertions(+)

diff --git a/devel/llvm12/files/patch-llvm_include_llvm_Analysis_TargetTransformInfo.h b/devel/llvm12/files/patch-llvm_include_llvm_Analysis_TargetTransformInfo.h
new file mode 100644
index 000000000000..07cad777ea24
--- /dev/null
+++ b/devel/llvm12/files/patch-llvm_include_llvm_Analysis_TargetTransformInfo.h
@@ -0,0 +1,10 @@
+--- llvm/include/llvm/Analysis/TargetTransformInfo.h.orig	2021-06-28 16:23:38 UTC
++++ llvm/include/llvm/Analysis/TargetTransformInfo.h
+@@ -94,6 +94,7 @@ struct HardwareLoopInfo {
+   Loop *L = nullptr;
+   BasicBlock *ExitBlock = nullptr;
+   BranchInst *ExitBranch = nullptr;
++  const SCEV *ExitCount = nullptr;
+   const SCEV *TripCount = nullptr;
+   IntegerType *CountType = nullptr;
+   Value *LoopDecrement = nullptr; // Decrement the loop counter by this
diff --git a/devel/llvm12/files/patch-llvm_lib_Analysis_TargetTransformInfo.cpp b/devel/llvm12/files/patch-llvm_lib_Analysis_TargetTransformInfo.cpp
new file mode 100644
index 000000000000..566e910213f5
--- /dev/null
+++ b/devel/llvm12/files/patch-llvm_lib_Analysis_TargetTransformInfo.cpp
@@ -0,0 +1,14 @@
+--- llvm/lib/Analysis/TargetTransformInfo.cpp.orig	2021-06-28 16:23:38 UTC
++++ llvm/lib/Analysis/TargetTransformInfo.cpp
+@@ -217,10 +217,7 @@ bool HardwareLoopInfo::isHardwareLoopCandidate(ScalarE
+     // Note that this block may not be the loop latch block, even if the loop
+     // has a latch block.
+     ExitBlock = BB;
+-    TripCount = SE.getAddExpr(EC, SE.getOne(EC->getType()));
+-
+-    if (!EC->getType()->isPointerTy() && EC->getType() != CountType)
+-      TripCount = SE.getZeroExtendExpr(TripCount, CountType);
++    ExitCount = EC;
+ 
+     break;
+   }
diff --git a/devel/llvm12/files/patch-llvm_lib_CodeGen_HardwareLoops.cpp b/devel/llvm12/files/patch-llvm_lib_CodeGen_HardwareLoops.cpp
new file mode 100644
index 000000000000..320f63aec550
--- /dev/null
+++ b/devel/llvm12/files/patch-llvm_lib_CodeGen_HardwareLoops.cpp
@@ -0,0 +1,75 @@
+--- llvm/lib/CodeGen/HardwareLoops.cpp.orig	2021-06-28 16:23:38 UTC
++++ llvm/lib/CodeGen/HardwareLoops.cpp
+@@ -187,7 +187,7 @@ namespace {
+                  const DataLayout &DL,
+                  OptimizationRemarkEmitter *ORE) :
+       SE(SE), DL(DL), ORE(ORE), L(Info.L), M(L->getHeader()->getModule()),
+-      TripCount(Info.TripCount),
++      ExitCount(Info.ExitCount),
+       CountType(Info.CountType),
+       ExitBranch(Info.ExitBranch),
+       LoopDecrement(Info.LoopDecrement),
+@@ -202,7 +202,7 @@ namespace {
+     OptimizationRemarkEmitter *ORE = nullptr;
+     Loop *L                 = nullptr;
+     Module *M               = nullptr;
+-    const SCEV *TripCount   = nullptr;
++    const SCEV *ExitCount   = nullptr;
+     Type *CountType         = nullptr;
+     BranchInst *ExitBranch  = nullptr;
+     Value *LoopDecrement    = nullptr;
+@@ -298,7 +298,7 @@ bool HardwareLoops::TryConvertLoop(HardwareLoopInfo &H
+   }
+ 
+   assert(
+-      (HWLoopInfo.ExitBlock && HWLoopInfo.ExitBranch && HWLoopInfo.TripCount) &&
++      (HWLoopInfo.ExitBlock && HWLoopInfo.ExitBranch && HWLoopInfo.ExitCount) &&
+       "Hardware Loop must have set exit info.");
+ 
+   BasicBlock *Preheader = L->getLoopPreheader();
+@@ -384,12 +384,18 @@ Value *HardwareLoop::InitLoopCount() {
+ 
+   SCEVExpander SCEVE(SE, DL, "loopcnt");
+ 
++  if (!ExitCount->getType()->isPointerTy() &&
++       ExitCount->getType() != CountType)
++    ExitCount = SE.getZeroExtendExpr(ExitCount, CountType);
++
++  ExitCount = SE.getAddExpr(ExitCount, SE.getOne(CountType));
++
+   // If we're trying to use the 'test and set' form of the intrinsic, we need
+   // to replace a conditional branch that is controlling entry to the loop. It
+   // is likely (guaranteed?) that the preheader has an unconditional branch to
+   // the loop header, so also check if it has a single predecessor.
+-  if (SE.isLoopEntryGuardedByCond(L, ICmpInst::ICMP_NE, TripCount,
+-                                  SE.getZero(TripCount->getType()))) {
++  if (SE.isLoopEntryGuardedByCond(L, ICmpInst::ICMP_NE, ExitCount,
++			          SE.getZero(ExitCount->getType()))) {
+     LLVM_DEBUG(dbgs() << " - Attempting to use test.set counter.\n");
+     UseLoopGuard |= ForceGuardLoopEntry;
+   } else
+@@ -401,19 +407,19 @@ Value *HardwareLoop::InitLoopCount() {
+     BasicBlock *Predecessor = BB->getSinglePredecessor();
+     // If it's not safe to create a while loop then don't force it and create a
+     // do-while loop instead
+-    if (!isSafeToExpandAt(TripCount, Predecessor->getTerminator(), SE))
++    if (!isSafeToExpandAt(ExitCount, Predecessor->getTerminator(), SE))
+         UseLoopGuard = false;
+     else
+         BB = Predecessor;
+   }
+ 
+-  if (!isSafeToExpandAt(TripCount, BB->getTerminator(), SE)) {
+-    LLVM_DEBUG(dbgs() << "- Bailing, unsafe to expand TripCount "
+-               << *TripCount << "\n");
++  if (!isSafeToExpandAt(ExitCount, BB->getTerminator(), SE)) {
++    LLVM_DEBUG(dbgs() << "- Bailing, unsafe to expand ExitCount "
++               << *ExitCount << "\n");
+     return nullptr;
+   }
+ 
+-  Value *Count = SCEVE.expandCodeFor(TripCount, CountType,
++  Value *Count = SCEVE.expandCodeFor(ExitCount, CountType,
+                                      BB->getTerminator());
+ 
+   // FIXME: We've expanded Count where we hope to insert the counter setting