mirror of
https://git.proxmox.com/git/llvm-toolchain
synced 2025-06-24 22:00:27 +00:00
don't need these patches (they were backport)
This commit is contained in:
parent
ef03b2f0a6
commit
b5ac0ff930
2148
debian/patches/D40146-JumpThreading-backport-1.diff
vendored
2148
debian/patches/D40146-JumpThreading-backport-1.diff
vendored
File diff suppressed because it is too large
Load Diff
267
debian/patches/D42717-JumpThreading-backport-2.diff
vendored
267
debian/patches/D42717-JumpThreading-backport-2.diff
vendored
@ -1,267 +0,0 @@
|
||||
Index: llvm-toolchain-6.0-6.0.1/include/llvm/Analysis/LazyValueInfo.h
|
||||
===================================================================
|
||||
--- llvm-toolchain-6.0-6.0.1.orig/include/llvm/Analysis/LazyValueInfo.h
|
||||
+++ llvm-toolchain-6.0-6.0.1/include/llvm/Analysis/LazyValueInfo.h
|
||||
@@ -113,6 +113,13 @@ public:
|
||||
/// in LVI, so we need to pass it here as an argument.
|
||||
void printLVI(Function &F, DominatorTree &DTree, raw_ostream &OS);
|
||||
|
||||
+ /// Disables use of the DominatorTree within LVI.
|
||||
+ void disableDT();
|
||||
+
|
||||
+ /// Enables use of the DominatorTree within LVI. Does nothing if the class
|
||||
+ /// instance was initialized without a DT pointer.
|
||||
+ void enableDT();
|
||||
+
|
||||
// For old PM pass. Delete once LazyValueInfoWrapperPass is gone.
|
||||
void releaseMemory();
|
||||
|
||||
Index: llvm-toolchain-6.0-6.0.1/include/llvm/IR/Dominators.h
|
||||
===================================================================
|
||||
--- llvm-toolchain-6.0-6.0.1.orig/include/llvm/IR/Dominators.h
|
||||
+++ llvm-toolchain-6.0-6.0.1/include/llvm/IR/Dominators.h
|
||||
@@ -342,6 +342,9 @@ public:
|
||||
/// \brief Returns true if DelBB is awaiting deletion at a flush() event.
|
||||
bool pendingDeletedBB(BasicBlock *DelBB);
|
||||
|
||||
+ /// \brief Returns true if pending DT updates are queued for a flush() event.
|
||||
+ bool pending();
|
||||
+
|
||||
/// \brief Flushes all pending updates and block deletions. Returns a
|
||||
/// correct DominatorTree reference to be used by the caller for analysis.
|
||||
DominatorTree &flush();
|
||||
Index: llvm-toolchain-6.0-6.0.1/lib/Analysis/LazyValueInfo.cpp
|
||||
===================================================================
|
||||
--- llvm-toolchain-6.0-6.0.1.orig/lib/Analysis/LazyValueInfo.cpp
|
||||
+++ llvm-toolchain-6.0-6.0.1/lib/Analysis/LazyValueInfo.cpp
|
||||
@@ -401,6 +401,7 @@ namespace {
|
||||
AssumptionCache *AC; ///< A pointer to the cache of @llvm.assume calls.
|
||||
const DataLayout &DL; ///< A mandatory DataLayout
|
||||
DominatorTree *DT; ///< An optional DT pointer.
|
||||
+ DominatorTree *DisabledDT; ///< Stores DT if it's disabled.
|
||||
|
||||
ValueLatticeElement getBlockValue(Value *Val, BasicBlock *BB);
|
||||
bool getEdgeValue(Value *V, BasicBlock *F, BasicBlock *T,
|
||||
@@ -463,13 +464,30 @@ namespace {
|
||||
TheCache.eraseBlock(BB);
|
||||
}
|
||||
|
||||
+ /// Disables use of the DominatorTree within LVI.
|
||||
+ void disableDT() {
|
||||
+ if (DT) {
|
||||
+ assert(!DisabledDT && "Both DT and DisabledDT are not nullptr!");
|
||||
+ std::swap(DT, DisabledDT);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /// Enables use of the DominatorTree within LVI. Does nothing if the class
|
||||
+ /// instance was initialized without a DT pointer.
|
||||
+ void enableDT() {
|
||||
+ if (DisabledDT) {
|
||||
+ assert(!DT && "Both DT and DisabledDT are not nullptr!");
|
||||
+ std::swap(DT, DisabledDT);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/// This is the update interface to inform the cache that an edge from
|
||||
/// PredBB to OldSucc has been threaded to be from PredBB to NewSucc.
|
||||
void threadEdge(BasicBlock *PredBB,BasicBlock *OldSucc,BasicBlock *NewSucc);
|
||||
|
||||
LazyValueInfoImpl(AssumptionCache *AC, const DataLayout &DL,
|
||||
DominatorTree *DT = nullptr)
|
||||
- : AC(AC), DL(DL), DT(DT) {}
|
||||
+ : AC(AC), DL(DL), DT(DT), DisabledDT(nullptr) {}
|
||||
};
|
||||
} // end anonymous namespace
|
||||
|
||||
@@ -1791,6 +1809,16 @@ void LazyValueInfo::printLVI(Function &F
|
||||
}
|
||||
}
|
||||
|
||||
+void LazyValueInfo::disableDT() {
|
||||
+ if (PImpl)
|
||||
+ getImpl(PImpl, AC, DL, DT).disableDT();
|
||||
+}
|
||||
+
|
||||
+void LazyValueInfo::enableDT() {
|
||||
+ if (PImpl)
|
||||
+ getImpl(PImpl, AC, DL, DT).enableDT();
|
||||
+}
|
||||
+
|
||||
// Print the LVI for the function arguments at the start of each basic block.
|
||||
void LazyValueInfoAnnotatedWriter::emitBasicBlockStartAnnot(
|
||||
const BasicBlock *BB, formatted_raw_ostream &OS) {
|
||||
Index: llvm-toolchain-6.0-6.0.1/lib/IR/Dominators.cpp
|
||||
===================================================================
|
||||
--- llvm-toolchain-6.0-6.0.1.orig/lib/IR/Dominators.cpp
|
||||
+++ llvm-toolchain-6.0-6.0.1/lib/IR/Dominators.cpp
|
||||
@@ -453,6 +453,9 @@ bool DeferredDominance::pendingDeletedBB
|
||||
return DeletedBBs.count(DelBB) != 0;
|
||||
}
|
||||
|
||||
+/// \brief Returns true if pending DT updates are queued for a flush() event.
|
||||
+bool DeferredDominance::pending() { return !PendUpdates.empty(); }
|
||||
+
|
||||
/// \brief Flushes all pending updates and block deletions. Returns a
|
||||
/// correct DominatorTree reference to be used by the caller for analysis.
|
||||
DominatorTree &DeferredDominance::flush() {
|
||||
Index: llvm-toolchain-6.0-6.0.1/lib/Transforms/Scalar/JumpThreading.cpp
|
||||
===================================================================
|
||||
--- llvm-toolchain-6.0-6.0.1.orig/lib/Transforms/Scalar/JumpThreading.cpp
|
||||
+++ llvm-toolchain-6.0-6.0.1/lib/Transforms/Scalar/JumpThreading.cpp
|
||||
@@ -425,6 +425,7 @@ bool JumpThreadingPass::runImpl(Function
|
||||
|
||||
LoopHeaders.clear();
|
||||
DDT->flush();
|
||||
+ LVI->enableDT();
|
||||
return EverChanged;
|
||||
}
|
||||
|
||||
@@ -617,6 +618,10 @@ bool JumpThreadingPass::ComputeValueKnow
|
||||
// "X < 4" and "X < 3" is known true but "X < 4" itself is not available.
|
||||
// Perhaps getConstantOnEdge should be smart enough to do this?
|
||||
|
||||
+ if (DDT->pending())
|
||||
+ LVI->disableDT();
|
||||
+ else
|
||||
+ LVI->enableDT();
|
||||
for (BasicBlock *P : predecessors(BB)) {
|
||||
// If the value is known by LazyValueInfo to be a constant in a
|
||||
// predecessor, use that information to try to thread this block.
|
||||
@@ -630,6 +635,10 @@ bool JumpThreadingPass::ComputeValueKnow
|
||||
|
||||
/// If I is a PHI node, then we know the incoming values for any constants.
|
||||
if (PHINode *PN = dyn_cast<PHINode>(I)) {
|
||||
+ if (DDT->pending())
|
||||
+ LVI->disableDT();
|
||||
+ else
|
||||
+ LVI->enableDT();
|
||||
for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
|
||||
Value *InVal = PN->getIncomingValue(i);
|
||||
if (Constant *KC = getKnownConstant(InVal, Preference)) {
|
||||
@@ -759,6 +768,10 @@ bool JumpThreadingPass::ComputeValueKnow
|
||||
const DataLayout &DL = PN->getModule()->getDataLayout();
|
||||
// We can do this simplification if any comparisons fold to true or false.
|
||||
// See if any do.
|
||||
+ if (DDT->pending())
|
||||
+ LVI->disableDT();
|
||||
+ else
|
||||
+ LVI->enableDT();
|
||||
for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
|
||||
BasicBlock *PredBB = PN->getIncomingBlock(i);
|
||||
Value *LHS = PN->getIncomingValue(i);
|
||||
@@ -792,6 +805,10 @@ bool JumpThreadingPass::ComputeValueKnow
|
||||
|
||||
if (!isa<Instruction>(CmpLHS) ||
|
||||
cast<Instruction>(CmpLHS)->getParent() != BB) {
|
||||
+ if (DDT->pending())
|
||||
+ LVI->disableDT();
|
||||
+ else
|
||||
+ LVI->enableDT();
|
||||
for (BasicBlock *P : predecessors(BB)) {
|
||||
// If the value is known by LazyValueInfo to be a constant in a
|
||||
// predecessor, use that information to try to thread this block.
|
||||
@@ -820,6 +837,10 @@ bool JumpThreadingPass::ComputeValueKnow
|
||||
match(CmpLHS, m_Add(m_Value(AddLHS), m_ConstantInt(AddConst)))) {
|
||||
if (!isa<Instruction>(AddLHS) ||
|
||||
cast<Instruction>(AddLHS)->getParent() != BB) {
|
||||
+ if (DDT->pending())
|
||||
+ LVI->disableDT();
|
||||
+ else
|
||||
+ LVI->enableDT();
|
||||
for (BasicBlock *P : predecessors(BB)) {
|
||||
// If the value is known by LazyValueInfo to be a ConstantRange in
|
||||
// a predecessor, use that information to try to thread this
|
||||
@@ -901,6 +922,10 @@ bool JumpThreadingPass::ComputeValueKnow
|
||||
}
|
||||
|
||||
// If all else fails, see if LVI can figure out a constant value for us.
|
||||
+ if (DDT->pending())
|
||||
+ LVI->disableDT();
|
||||
+ else
|
||||
+ LVI->enableDT();
|
||||
Constant *CI = LVI->getConstant(V, BB, CxtI);
|
||||
if (Constant *KC = getKnownConstant(CI, Preference)) {
|
||||
for (BasicBlock *Pred : predecessors(BB))
|
||||
@@ -1102,6 +1127,10 @@ bool JumpThreadingPass::ProcessBlock(Bas
|
||||
// threading is concerned.
|
||||
assert(CondBr->isConditional() && "Threading on unconditional terminator");
|
||||
|
||||
+ if (DDT->pending())
|
||||
+ LVI->disableDT();
|
||||
+ else
|
||||
+ LVI->enableDT();
|
||||
LazyValueInfo::Tristate Ret =
|
||||
LVI->getPredicateAt(CondCmp->getPredicate(), CondCmp->getOperand(0),
|
||||
CondConst, CondBr);
|
||||
@@ -1914,6 +1943,10 @@ bool JumpThreadingPass::ThreadEdge(Basic
|
||||
<< ", across block:\n "
|
||||
<< *BB << "\n");
|
||||
|
||||
+ if (DDT->pending())
|
||||
+ LVI->disableDT();
|
||||
+ else
|
||||
+ LVI->enableDT();
|
||||
LVI->threadEdge(PredBB, BB, SuccBB);
|
||||
|
||||
// We are going to have to map operands from the original BB block to the new
|
||||
@@ -2383,6 +2416,10 @@ bool JumpThreadingPass::TryToUnfoldSelec
|
||||
// Now check if one of the select values would allow us to constant fold the
|
||||
// terminator in BB. We don't do the transform if both sides fold, those
|
||||
// cases will be threaded in any case.
|
||||
+ if (DDT->pending())
|
||||
+ LVI->disableDT();
|
||||
+ else
|
||||
+ LVI->enableDT();
|
||||
LazyValueInfo::Tristate LHSFolds =
|
||||
LVI->getPredicateOnEdge(CondCmp->getPredicate(), SI->getOperand(1),
|
||||
CondRHS, Pred, BB, CondCmp);
|
||||
Index: llvm-toolchain-6.0-6.0.1/test/Transforms/JumpThreading/pr36133.ll
|
||||
===================================================================
|
||||
--- /dev/null
|
||||
+++ llvm-toolchain-6.0-6.0.1/test/Transforms/JumpThreading/pr36133.ll
|
||||
@@ -0,0 +1,44 @@
|
||||
+; RUN: opt -jump-threading -S < %s | FileCheck %s
|
||||
+@global = external global i8*, align 8
|
||||
+
|
||||
+define i32 @foo(i32 %arg) {
|
||||
+; CHECK-LABEL: @foo
|
||||
+; CHECK-LABEL: bb:
|
||||
+; CHECK: icmp eq
|
||||
+; CHECK-NEXT: br i1 %tmp1, label %bb7, label %bb7
|
||||
+bb:
|
||||
+ %tmp = load i8*, i8** @global, align 8
|
||||
+ %tmp1 = icmp eq i8* %tmp, null
|
||||
+ br i1 %tmp1, label %bb3, label %bb2
|
||||
+
|
||||
+; CHECK-NOT: bb2:
|
||||
+bb2:
|
||||
+ br label %bb3
|
||||
+
|
||||
+; CHECK-NOT: bb3:
|
||||
+bb3:
|
||||
+ %tmp4 = phi i8 [ 1, %bb2 ], [ 0, %bb ]
|
||||
+ %tmp5 = icmp eq i8 %tmp4, 0
|
||||
+ br i1 %tmp5, label %bb7, label %bb6
|
||||
+
|
||||
+; CHECK-NOT: bb6:
|
||||
+bb6:
|
||||
+ br label %bb7
|
||||
+
|
||||
+; CHECK-LABEL: bb7:
|
||||
+bb7:
|
||||
+ %tmp8 = icmp eq i32 %arg, -1
|
||||
+ br i1 %tmp8, label %bb9, label %bb10
|
||||
+
|
||||
+; CHECK-LABEL: bb9:
|
||||
+bb9:
|
||||
+ ret i32 0
|
||||
+
|
||||
+; CHECK-LABEL: bb10:
|
||||
+bb10:
|
||||
+ %tmp11 = icmp sgt i32 %arg, -1
|
||||
+ call void @llvm.assume(i1 %tmp11)
|
||||
+ ret i32 1
|
||||
+}
|
||||
+
|
||||
+declare void @llvm.assume(i1)
|
187
debian/patches/llvm-D49832-SCEVPred.patch
vendored
187
debian/patches/llvm-D49832-SCEVPred.patch
vendored
@ -1,187 +0,0 @@
|
||||
commit 98592fcc61307968f7df1362771534595a1e1c21
|
||||
Author: Keno Fischer <keno@juliacomputing.com>
|
||||
Date: Wed Jul 25 19:29:02 2018 -0400
|
||||
|
||||
[SCEV] Don't expand Wrap predicate using inttoptr in ni addrspaces
|
||||
|
||||
Summary:
|
||||
In non-integral address spaces, we're not allowed to introduce inttoptr/ptrtoint
|
||||
intrinsics. Instead, we need to expand any pointer arithmetic as geps on the
|
||||
base pointer. Luckily this is a common task for SCEV, so all we have to do here
|
||||
is hook up the corresponding helper function and add test case.
|
||||
|
||||
Fixes PR38290
|
||||
|
||||
Reviewers: reames, sanjoy
|
||||
|
||||
Subscribers: javed.absar, llvm-commits
|
||||
|
||||
Differential Revision: https://reviews.llvm.org/D49832
|
||||
|
||||
diff --git a/lib/Analysis/ScalarEvolutionExpander.cpp b/lib/Analysis/ScalarEvolutionExpander.cpp
|
||||
index 7f76f057216..f441a3647fb 100644
|
||||
--- a/lib/Analysis/ScalarEvolutionExpander.cpp
|
||||
+++ b/lib/Analysis/ScalarEvolutionExpander.cpp
|
||||
@@ -2154,8 +2154,9 @@ Value *SCEVExpander::generateOverflowCheck(const SCEVAddRecExpr *AR,
|
||||
const SCEV *Step = AR->getStepRecurrence(SE);
|
||||
const SCEV *Start = AR->getStart();
|
||||
|
||||
+ Type *ARTy = AR->getType();
|
||||
unsigned SrcBits = SE.getTypeSizeInBits(ExitCount->getType());
|
||||
- unsigned DstBits = SE.getTypeSizeInBits(AR->getType());
|
||||
+ unsigned DstBits = SE.getTypeSizeInBits(ARTy);
|
||||
|
||||
// The expression {Start,+,Step} has nusw/nssw if
|
||||
// Step < 0, Start - |Step| * Backedge <= Start
|
||||
@@ -2167,11 +2168,12 @@ Value *SCEVExpander::generateOverflowCheck(const SCEVAddRecExpr *AR,
|
||||
Value *TripCountVal = expandCodeFor(ExitCount, CountTy, Loc);
|
||||
|
||||
IntegerType *Ty =
|
||||
- IntegerType::get(Loc->getContext(), SE.getTypeSizeInBits(AR->getType()));
|
||||
+ IntegerType::get(Loc->getContext(), SE.getTypeSizeInBits(ARTy));
|
||||
+ Type *ARExpandTy = DL.isNonIntegralPointerType(ARTy) ? ARTy : Ty;
|
||||
|
||||
Value *StepValue = expandCodeFor(Step, Ty, Loc);
|
||||
Value *NegStepValue = expandCodeFor(SE.getNegativeSCEV(Step), Ty, Loc);
|
||||
- Value *StartValue = expandCodeFor(Start, Ty, Loc);
|
||||
+ Value *StartValue = expandCodeFor(Start, ARExpandTy, Loc);
|
||||
|
||||
ConstantInt *Zero =
|
||||
ConstantInt::get(Loc->getContext(), APInt::getNullValue(DstBits));
|
||||
@@ -2194,8 +2196,21 @@ Value *SCEVExpander::generateOverflowCheck(const SCEVAddRecExpr *AR,
|
||||
// Compute:
|
||||
// Start + |Step| * Backedge < Start
|
||||
// Start - |Step| * Backedge > Start
|
||||
- Value *Add = Builder.CreateAdd(StartValue, MulV);
|
||||
- Value *Sub = Builder.CreateSub(StartValue, MulV);
|
||||
+ Value *Add = nullptr, *Sub = nullptr;
|
||||
+ if (ARExpandTy->isPointerTy()) {
|
||||
+ PointerType *ARPtrTy = cast<PointerType>(ARExpandTy);
|
||||
+ const SCEV *MulS = SE.getSCEV(MulV);
|
||||
+ const SCEV *const StepArray[2] = {MulS, SE.getNegativeSCEV(MulS)};
|
||||
+ Add = Builder.CreateBitCast(
|
||||
+ expandAddToGEP(&StepArray[0], &StepArray[1], ARPtrTy, Ty, StartValue),
|
||||
+ ARPtrTy);
|
||||
+ Sub = Builder.CreateBitCast(
|
||||
+ expandAddToGEP(&StepArray[1], &StepArray[2], ARPtrTy, Ty, StartValue),
|
||||
+ ARPtrTy);
|
||||
+ } else {
|
||||
+ Add = Builder.CreateAdd(StartValue, MulV);
|
||||
+ Sub = Builder.CreateSub(StartValue, MulV);
|
||||
+ }
|
||||
|
||||
Value *EndCompareGT = Builder.CreateICmp(
|
||||
Signed ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT, Sub, StartValue);
|
||||
diff --git a/test/Analysis/LoopAccessAnalysis/wrapping-pointer-ni.ll b/test/Analysis/LoopAccessAnalysis/wrapping-pointer-ni.ll
|
||||
new file mode 100644
|
||||
index 00000000000..ddcf5e1a195
|
||||
--- /dev/null
|
||||
+++ b/test/Analysis/LoopAccessAnalysis/wrapping-pointer-ni.ll
|
||||
@@ -0,0 +1,73 @@
|
||||
+; RUN: opt -loop-versioning -S < %s | FileCheck %s -check-prefix=LV
|
||||
+
|
||||
+; NB: addrspaces 10-13 are non-integral
|
||||
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128-ni:10:11:12:13"
|
||||
+
|
||||
+; This matches the test case from PR38290
|
||||
+; Check that we expand the SCEV predicate check using GEP, rather
|
||||
+; than ptrtoint.
|
||||
+
|
||||
+%jl_value_t = type opaque
|
||||
+%jl_array_t = type { i8 addrspace(13)*, i64, i16, i16, i32 }
|
||||
+
|
||||
+declare i64 @julia_steprange_last_4949()
|
||||
+
|
||||
+define void @"japi1_align!_9477"(%jl_value_t addrspace(10)**) #0 {
|
||||
+; LV-LAVEL: L26.lver.check
|
||||
+; LV: [[OFMul:%[^ ]*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 4, i64 [[Step:%[^ ]*]])
|
||||
+; LV-NEXT: [[OFMulResult:%[^ ]*]] = extractvalue { i64, i1 } [[OFMul]], 0
|
||||
+; LV-NEXT: [[OFMulOverflow:%[^ ]*]] = extractvalue { i64, i1 } [[OFMul]], 1
|
||||
+; LV-NEXT: [[PosGEP:%[^ ]*]] = getelementptr i32, i32 addrspace(13)* [[Base:%[^ ]*]], i64 [[Step]]
|
||||
+; LV-NEXT: [[NegGEP:%[^ ]*]] = getelementptr i32, i32 addrspace(13)* [[Base]], i64 [[NegStep:%[^ ]*]]
|
||||
+; LV-NEXT: icmp ugt i32 addrspace(13)* [[NegGEP]], [[Base]]
|
||||
+; LV-NEXT: icmp ult i32 addrspace(13)* [[PosGEP]], [[Base]]
|
||||
+; LV-NOT: inttoptr
|
||||
+; LV-NOT: ptrtoint
|
||||
+top:
|
||||
+ %1 = load %jl_value_t addrspace(10)*, %jl_value_t addrspace(10)** %0, align 8, !nonnull !1, !dereferenceable !2, !align !3
|
||||
+ %2 = load i32, i32* inttoptr (i64 12 to i32*), align 4, !tbaa !4
|
||||
+ %3 = sub i32 0, %2
|
||||
+ %4 = call i64 @julia_steprange_last_4949()
|
||||
+ %5 = addrspacecast %jl_value_t addrspace(10)* %1 to %jl_value_t addrspace(11)*
|
||||
+ %6 = bitcast %jl_value_t addrspace(11)* %5 to %jl_value_t addrspace(10)* addrspace(11)*
|
||||
+ %7 = load %jl_value_t addrspace(10)*, %jl_value_t addrspace(10)* addrspace(11)* %6, align 8, !tbaa !4, !nonnull !1, !dereferenceable !9, !align !2
|
||||
+ %8 = addrspacecast %jl_value_t addrspace(10)* %7 to %jl_value_t addrspace(11)*
|
||||
+ %9 = bitcast %jl_value_t addrspace(11)* %8 to i32 addrspace(13)* addrspace(11)*
|
||||
+ %10 = load i32 addrspace(13)*, i32 addrspace(13)* addrspace(11)* %9, align 8, !tbaa !10, !nonnull !1
|
||||
+ %11 = sext i32 %3 to i64
|
||||
+ br label %L26
|
||||
+
|
||||
+L26: ; preds = %L26, %top
|
||||
+ %value_phi3 = phi i64 [ 0, %top ], [ %12, %L26 ]
|
||||
+ %12 = add i64 %value_phi3, -1
|
||||
+ %13 = getelementptr inbounds i32, i32 addrspace(13)* %10, i64 %12
|
||||
+ %14 = load i32, i32 addrspace(13)* %13, align 4, !tbaa !13
|
||||
+ %15 = add i64 %12, %11
|
||||
+ %16 = getelementptr inbounds i32, i32 addrspace(13)* %10, i64 %15
|
||||
+ store i32 %14, i32 addrspace(13)* %16, align 4, !tbaa !13
|
||||
+ %17 = icmp eq i64 %value_phi3, %4
|
||||
+ br i1 %17, label %L45, label %L26
|
||||
+
|
||||
+L45: ; preds = %L26
|
||||
+ ret void
|
||||
+}
|
||||
+
|
||||
+attributes #0 = { "thunk" }
|
||||
+
|
||||
+!llvm.module.flags = !{!0}
|
||||
+
|
||||
+!0 = !{i32 1, !"Debug Info Version", i32 3}
|
||||
+!1 = !{}
|
||||
+!2 = !{i64 16}
|
||||
+!3 = !{i64 8}
|
||||
+!4 = !{!5, !5, i64 0}
|
||||
+!5 = !{!"jtbaa_mutab", !6, i64 0}
|
||||
+!6 = !{!"jtbaa_value", !7, i64 0}
|
||||
+!7 = !{!"jtbaa_data", !8, i64 0}
|
||||
+!8 = !{!"jtbaa"}
|
||||
+!9 = !{i64 40}
|
||||
+!10 = !{!11, !11, i64 0}
|
||||
+!11 = !{!"jtbaa_arrayptr", !12, i64 0}
|
||||
+!12 = !{!"jtbaa_array", !8, i64 0}
|
||||
+!13 = !{!14, !14, i64 0}
|
||||
+!14 = !{!"jtbaa_arraybuf", !7, i64 0}
|
||||
diff --git a/test/Analysis/LoopAccessAnalysis/wrapping-pointer-versioning.ll b/test/Analysis/LoopAccessAnalysis/wrapping-pointer-versioning.ll
|
||||
index a7e5bce7445..fa6fccecbf1 100644
|
||||
--- a/test/Analysis/LoopAccessAnalysis/wrapping-pointer-versioning.ll
|
||||
+++ b/test/Analysis/LoopAccessAnalysis/wrapping-pointer-versioning.ll
|
||||
@@ -58,10 +58,10 @@ target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
||||
; LV-NEXT: [[OFMul1:%[^ ]*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 4, i64 [[BE]])
|
||||
; LV-NEXT: [[OFMulResult1:%[^ ]*]] = extractvalue { i64, i1 } [[OFMul1]], 0
|
||||
; LV-NEXT: [[OFMulOverflow1:%[^ ]*]] = extractvalue { i64, i1 } [[OFMul1]], 1
|
||||
-; LV-NEXT: [[AddEnd1:%[^ ]*]] = add i64 %a2, [[OFMulResult1]]
|
||||
-; LV-NEXT: [[SubEnd1:%[^ ]*]] = sub i64 %a2, [[OFMulResult1]]
|
||||
-; LV-NEXT: [[CmpNeg1:%[^ ]*]] = icmp ugt i64 [[SubEnd1]], %a2
|
||||
-; LV-NEXT: [[CmpPos1:%[^ ]*]] = icmp ult i64 [[AddEnd1]], %a2
|
||||
+; LV-NEXT: [[AddEnd1:%[^ ]*]] = add i64 [[A0:%[^ ]*]], [[OFMulResult1]]
|
||||
+; LV-NEXT: [[SubEnd1:%[^ ]*]] = sub i64 [[A0]], [[OFMulResult1]]
|
||||
+; LV-NEXT: [[CmpNeg1:%[^ ]*]] = icmp ugt i64 [[SubEnd1]], [[A0]]
|
||||
+; LV-NEXT: [[CmpPos1:%[^ ]*]] = icmp ult i64 [[AddEnd1]], [[A0]]
|
||||
; LV-NEXT: [[Cmp:%[^ ]*]] = select i1 false, i1 [[CmpNeg1]], i1 [[CmpPos1]]
|
||||
; LV-NEXT: [[PredCheck1:%[^ ]*]] = or i1 [[Cmp]], [[OFMulOverflow1]]
|
||||
|
||||
@@ -233,10 +233,10 @@ for.end: ; preds = %for.body
|
||||
; LV: [[OFMul1:%[^ ]*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 4, i64 [[BE:%[^ ]*]])
|
||||
; LV-NEXT: [[OFMulResult1:%[^ ]*]] = extractvalue { i64, i1 } [[OFMul1]], 0
|
||||
; LV-NEXT: [[OFMulOverflow1:%[^ ]*]] = extractvalue { i64, i1 } [[OFMul1]], 1
|
||||
-; LV-NEXT: [[AddEnd1:%[^ ]*]] = add i64 %a2, [[OFMulResult1]]
|
||||
-; LV-NEXT: [[SubEnd1:%[^ ]*]] = sub i64 %a2, [[OFMulResult1]]
|
||||
-; LV-NEXT: [[CmpNeg1:%[^ ]*]] = icmp ugt i64 [[SubEnd1]], %a2
|
||||
-; LV-NEXT: [[CmpPos1:%[^ ]*]] = icmp ult i64 [[AddEnd1]], %a2
|
||||
+; LV-NEXT: [[AddEnd1:%[^ ]*]] = add i64 [[A0:%[^ ]*]], [[OFMulResult1]]
|
||||
+; LV-NEXT: [[SubEnd1:%[^ ]*]] = sub i64 [[A0]], [[OFMulResult1]]
|
||||
+; LV-NEXT: [[CmpNeg1:%[^ ]*]] = icmp ugt i64 [[SubEnd1]], [[A0]]
|
||||
+; LV-NEXT: [[CmpPos1:%[^ ]*]] = icmp ult i64 [[AddEnd1]], [[A0]]
|
||||
; LV-NEXT: [[Cmp:%[^ ]*]] = select i1 false, i1 [[CmpNeg1]], i1 [[CmpPos1]]
|
||||
; LV-NEXT: [[PredCheck1:%[^ ]*]] = or i1 [[Cmp]], [[OFMulOverflow1]]
|
||||
|
45
debian/patches/llvm-rL323946-LSRTy.patch
vendored
45
debian/patches/llvm-rL323946-LSRTy.patch
vendored
@ -1,45 +0,0 @@
|
||||
commit ab60b05a472e8651cbe53c19513b7e62b9ff32df
|
||||
Author: Mikael Holmen <mikael.holmen@ericsson.com>
|
||||
Date: Thu Feb 1 06:38:34 2018 +0000
|
||||
|
||||
[LSR] Don't force bases of foldable formulae to the final type.
|
||||
|
||||
Summary:
|
||||
Before emitting code for scaled registers, we prevent
|
||||
SCEVExpander from hoisting any scaled addressing mode
|
||||
by emitting all the bases first. However, these bases
|
||||
are being forced to the final type, resulting in some
|
||||
odd code.
|
||||
|
||||
For example, if the type of the base is an integer and
|
||||
the final type is a pointer, we will emit an inttoptr
|
||||
for the base, a ptrtoint for the scale, and then a
|
||||
'reverse' GEP where the GEP pointer is actually the base
|
||||
integer and the index is the pointer. It's more intuitive
|
||||
to use the pointer as a pointer and the integer as index.
|
||||
|
||||
Patch by: Bevin Hansson
|
||||
|
||||
Reviewers: atrick, qcolombet, sanjoy
|
||||
|
||||
Reviewed By: qcolombet
|
||||
|
||||
Subscribers: llvm-commits
|
||||
|
||||
Differential Revision: https://reviews.llvm.org/D42103
|
||||
|
||||
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@323946 91177308-0d34-0410-b5e6-96231b3b80d8
|
||||
|
||||
diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
|
||||
index 332c074a1df..4b8e2286ed9 100644
|
||||
--- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp
|
||||
+++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
|
||||
@@ -4993,7 +4993,7 @@ Value *LSRInstance::Expand(const LSRUse &LU, const LSRFixup &LF,
|
||||
// Unless the addressing mode will not be folded.
|
||||
if (!Ops.empty() && LU.Kind == LSRUse::Address &&
|
||||
isAMCompletelyFolded(TTI, LU, F)) {
|
||||
- Value *FullV = Rewriter.expandCodeFor(SE.getAddExpr(Ops), Ty);
|
||||
+ Value *FullV = Rewriter.expandCodeFor(SE.getAddExpr(Ops), nullptr);
|
||||
Ops.clear();
|
||||
Ops.push_back(SE.getUnknown(FullV));
|
||||
}
|
Loading…
Reference in New Issue
Block a user