Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion llvm/include/llvm/Analysis/LoopInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,11 @@ class LLVM_EXTERNAL_VISIBILITY Loop : public LoopBase<BasicBlock, Loop> {
/// Return the source code span of the loop.
LocRange getLocRange() const;

/// Return a string containing the location of the loop (file name + line
/// number if present, otherwise module name). Meant to be used for debug
/// printing within LLVM_DEBUG.
std::string getLocStr() const;

StringRef getName() const {
if (BasicBlock *Header = getHeader())
if (Header->hasName())
Expand Down Expand Up @@ -690,7 +695,6 @@ llvm::MDNode *
makePostTransformationMetadata(llvm::LLVMContext &Context, MDNode *OrigLoopID,
llvm::ArrayRef<llvm::StringRef> RemovePrefixes,
llvm::ArrayRef<llvm::MDNode *> AddAttrs);

} // namespace llvm

#endif
8 changes: 5 additions & 3 deletions llvm/lib/Analysis/LoopAccessAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2374,9 +2374,9 @@ void MemoryDepChecker::Dependence::print(

bool LoopAccessInfo::canAnalyzeLoop() {
// We need to have a loop header.
LLVM_DEBUG(dbgs() << "LAA: Found a loop in "
<< TheLoop->getHeader()->getParent()->getName() << ": "
<< TheLoop->getHeader()->getName() << '\n');
LLVM_DEBUG(dbgs() << "\nLAA: Checking a loop in '"
<< TheLoop->getHeader()->getParent()->getName() << "' from "
<< TheLoop->getLocStr() << "\n");

// We can only analyze innermost loops.
if (!TheLoop->isInnermost()) {
Expand All @@ -2403,6 +2403,8 @@ bool LoopAccessInfo::canAnalyzeLoop() {
return false;
}

LLVM_DEBUG(dbgs() << "LAA: Found a loop: " << TheLoop->getHeader()->getName()
<< "\n");
return true;
}

Expand Down
11 changes: 11 additions & 0 deletions llvm/lib/Analysis/LoopInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -663,6 +663,17 @@ Loop::LocRange Loop::getLocRange() const {
return LocRange();
}

std::string Loop::getLocStr() const {
std::string Result;
raw_string_ostream OS(Result);
if (const DebugLoc LoopDbgLoc = getStartLoc())
LoopDbgLoc.print(OS);
else
// Just print the module name.
OS << getHeader()->getParent()->getParent()->getModuleIdentifier();
return Result;
}

#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
LLVM_DUMP_METHOD void Loop::dump() const { print(dbgs()); }

Expand Down
9 changes: 6 additions & 3 deletions llvm/lib/Transforms/Scalar/LoopDistribute.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -659,9 +659,9 @@ class LoopDistributeForLoop {
bool processLoop() {
assert(L->isInnermost() && "Only process inner loops.");

LLVM_DEBUG(dbgs() << "\nLDist: In \""
<< L->getHeader()->getParent()->getName()
<< "\" checking " << *L << "\n");
LLVM_DEBUG(dbgs() << "\nLDist: Checking a loop in '"
<< L->getHeader()->getParent()->getName() << "' from "
<< L->getLocStr() << "\n");

// Having a single exit block implies there's also one exiting block.
if (!L->getExitBlock())
Expand All @@ -686,6 +686,9 @@ class LoopDistributeForLoop {
if (!Dependences || Dependences->empty())
return fail("NoUnsafeDeps", "no unsafe dependences to isolate");

LLVM_DEBUG(dbgs() << "LDist: Found a loop: " << L->getHeader()->getName()
<< "\n");

InstPartitionContainer Partitions(L, LI, DT);

// First, go through each memory operation and assign them to consecutive
Expand Down
27 changes: 3 additions & 24 deletions llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1027,23 +1027,6 @@ static void reportVectorization(OptimizationRemarkEmitter *ORE, Loop *TheLoop,

} // end namespace llvm

#ifndef NDEBUG
/// \return string containing a file name and a line # for the given loop.
static std::string getDebugLocString(const Loop *L) {
std::string Result;
if (L) {
raw_string_ostream OS(Result);
if (const DebugLoc LoopDbgLoc = L->getStartLoc())
LoopDbgLoc.print(OS);
else
// Just print the module name.
OS << L->getHeader()->getParent()->getParent()->getModuleIdentifier();
OS.flush();
}
return Result;
}
#endif

namespace llvm {

// Loop vectorization cost-model hints how the scalar epilogue loop should be
Expand Down Expand Up @@ -9836,13 +9819,9 @@ bool LoopVectorizePass::processLoop(Loop *L) {
assert((EnableVPlanNativePath || L->isInnermost()) &&
"VPlan-native path is not enabled. Only process inner loops.");

#ifndef NDEBUG
const std::string DebugLocStr = getDebugLocString(L);
#endif /* NDEBUG */

LLVM_DEBUG(dbgs() << "\nLV: Checking a loop in '"
<< L->getHeader()->getParent()->getName() << "' from "
<< DebugLocStr << "\n");
<< L->getLocStr() << "\n");

LoopVectorizeHints Hints(L, InterleaveOnlyWhenForced, *ORE, TTI);

Expand Down Expand Up @@ -10112,15 +10091,15 @@ bool LoopVectorizePass::processLoop(Loop *L) {
});
} else if (VectorizeLoop && !InterleaveLoop) {
LLVM_DEBUG(dbgs() << "LV: Found a vectorizable loop (" << VF.Width
<< ") in " << DebugLocStr << '\n');
<< ") in " << L->getLocStr() << '\n');
ORE->emit([&]() {
return OptimizationRemarkAnalysis(LV_NAME, IntDiagMsg.first,
L->getStartLoc(), L->getHeader())
<< IntDiagMsg.second;
});
} else if (VectorizeLoop && InterleaveLoop) {
LLVM_DEBUG(dbgs() << "LV: Found a vectorizable loop (" << VF.Width
<< ") in " << DebugLocStr << '\n');
<< ") in " << L->getLocStr() << '\n');
LLVM_DEBUG(dbgs() << "LV: Interleave Count is " << IC << '\n');
}

Expand Down
6 changes: 4 additions & 2 deletions llvm/test/Analysis/LoopAccessAnalysis/print-order.ll
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
; A[i+1] = A[i] + 1;
; }

; CHECK: LAA: Found a loop in negative_step: loop
; CHECK-LABEL: 'negative_step'
; CHECK: LAA: Found a loop: loop
; CHECK: LAA: Checking memory dependencies
; CHECK-NEXT: LAA: Src Scev: {(4092 + %A),+,-4}<nw><%loop>Sink Scev: {(4088 + %A)<nuw>,+,-4}<nw><%loop>(Induction step: -1)
; CHECK-NEXT: LAA: Distance for store i32 %add, ptr %gep.A.plus.1, align 4 to %l = load i32, ptr %gep.A, align 4: -4
Expand Down Expand Up @@ -37,7 +38,8 @@ exit:
; A[i-1] = A[i] + 1;
; }

; CHECK: LAA: Found a loop in positive_step: loop
; CHECK-LABEL: 'positive_step'
; CHECK: LAA: Found a loop: loop
; CHECK: LAA: Checking memory dependencies
; CHECK-NEXT: LAA: Src Scev: {(4 + %A)<nuw>,+,4}<nuw><%loop>Sink Scev: {%A,+,4}<nw><%loop>(Induction step: 1)
; CHECK-NEXT: LAA: Distance for %l = load i32, ptr %gep.A, align 4 to store i32 %add, ptr %gep.A.minus.1, align 4: -4
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ loop.end:
ret void
}

; CHECK-LABEL: LAA: Found a loop in regression_test_loop_access_scalable_typesize
; CHECK-LABEL: 'regression_test_loop_access_scalable_typesize'
; CHECK: LAA: Found a loop: vector.body
; CHECK: LAA: Bad stride - Scalable object:
define void @regression_test_loop_access_scalable_typesize(ptr %input_ptr) {
entry:
Expand All @@ -42,7 +43,8 @@ end:
ret void
}

; CHECK-LABEL: LAA: Found a loop in regression_test_loop_access_scalable_typesize_nonscalable_object
; CHECK-LABEL: 'regression_test_loop_access_scalable_typesize_nonscalable_object'
; CHECK: LAA: Found a loop: vector.body
; CHECK: LAA: Bad stride - Scalable object:
define void @regression_test_loop_access_scalable_typesize_nonscalable_object(ptr %input_ptr) {
entry:
Expand Down
43 changes: 43 additions & 0 deletions llvm/test/Transforms/LoopDistribute/debug-print.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
; RUN: opt -passes=loop-distribute -enable-loop-distribute \
; RUN: -debug-only=loop-distribute -disable-output 2>&1 %s | FileCheck %s

define void @f(ptr noalias %a, ptr noalias %b, ptr noalias %c, ptr noalias %d, i64 %stride) {
; CHECK-LABEL: 'f'
; CHECK: LDist: Found a loop: for.body
; CHECK: Backward dependences:
; CHECK-NEXT: Backward:
; CHECK-NEXT: %load.a = load i32, ptr %gep.a, align 4 ->
; CHECK-NEXT: store i32 %mul.a, ptr %gep.a.plus4, align 4
; CHECK: Seeded partitions:
; CHECK: Partition 0
; CHECK: Partition 1
; CHECK: Partition 2
; CHECK: Partition 3
; CHECK: Distributing loop
entry:
br label %for.body

for.body: ; preds = %for.body, %entry
%ind = phi i64 [ 0, %entry ], [ %add, %for.body ]
%gep.a = getelementptr inbounds i32, ptr %a, i64 %ind
%load.a = load i32, ptr %gep.a, align 4
%gep.b = getelementptr inbounds i32, ptr %b, i64 %ind
%load.b = load i32, ptr %gep.b, align 4
%mul.a = mul i32 %load.b, %load.a
%add = add nuw nsw i64 %ind, 1
%gep.a.plus4 = getelementptr inbounds i32, ptr %a, i64 %add
store i32 %mul.a, ptr %gep.a.plus4, align 4
%gep.d = getelementptr inbounds i32, ptr %d, i64 %ind
%loadD = load i32, ptr %gep.d, align 4
%mul = mul i64 %ind, %stride
%gep.strided.a = getelementptr inbounds i32, ptr %a, i64 %mul
%load.strided.a = load i32, ptr %gep.strided.a, align 4
%mul.c = mul i32 %loadD, %load.strided.a
%gep.c = getelementptr inbounds i32, ptr %c, i64 %ind
store i32 %mul.c, ptr %gep.c, align 4
%exitcond = icmp eq i64 %add, 20
br i1 %exitcond, label %exit, label %for.body

exit: ; preds = %for.body
ret void
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ target triple = "thumbv8.1m.main-none-unknown-eabi"
; NOTE: The strides of the starting address values in the inner loop differ, i.e.
; '(i * (n + 1))' vs '(i * n)'.

; DEBUG-LABEL: LAA: Found a loop in diff_checks:
; DEBUG-LABEL: 'diff_checks'
; DEBUG: LAA: Found a loop: inner.loop
; DEBUG: LAA: Not creating diff runtime check, since these cannot be hoisted out of the outer loop
; DEBUG: LAA: Adding RT check for range:
; DEBUG-NEXT: LAA: Expanded RT check for range to include outer loop in order to permit hoisting
Expand Down
30 changes: 20 additions & 10 deletions llvm/test/Transforms/LoopVectorize/runtime-checks-hoist.ll
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
; NOTE: The strides of the starting address values in the inner loop differ, i.e.
; '(i * (n + 1))' vs '(i * n)'.

; DEBUG-LABEL: LAA: Found a loop in diff_checks:
; DEBUG-LABEL: 'diff_checks'
; DEBUG: LAA: Found a loop: inner.loop
; DEBUG: LAA: Not creating diff runtime check, since these cannot be hoisted out of the outer loop
; DEBUG: LAA: Adding RT check for range:
; DEBUG-NEXT: LAA: Expanded RT check for range to include outer loop in order to permit hoisting
Expand Down Expand Up @@ -149,7 +150,8 @@ outer.exit:
; We decide to do full runtime checks here (as opposed to diff checks) due to
; the additional load of 'dst[(i * n) + j]' in the loop.

; DEBUG-LABEL: LAA: Found a loop in full_checks:
; DEBUG-LABEL: 'full_checks'
; DEBUG: LAA: Found a loop: inner.loop
; DEBUG-NOT: LAA: Creating diff runtime check for:
; DEBUG: LAA: Adding RT check for range:
; DEBUG-NEXT: LAA: Expanded RT check for range to include outer loop in order to permit hoisting
Expand Down Expand Up @@ -272,7 +274,8 @@ outer.exit:
; is accessed with a higher stride compared src, and therefore the inner loop
; runtime checks will vary for each outer loop iteration.

; DEBUG-LABEL: LAA: Found a loop in full_checks_diff_strides:
; DEBUG-LABEL: 'full_checks_diff_strides'
; DEBUG: LAA: Found a loop: inner.loop
; DEBUG-NOT: LAA: Creating diff runtime check for:
; DEBUG: LAA: Adding RT check for range:
; DEBUG-NEXT: LAA: Expanded RT check for range to include outer loop in order to permit hoisting
Expand Down Expand Up @@ -402,7 +405,8 @@ outer.exit:
; }
; }

; DEBUG-LABEL: LAA: Found a loop in diff_checks_src_start_invariant:
; DEBUG-LABEL: 'diff_checks_src_start_invariant'
; DEBUG: LAA: Found a loop: inner.loop
; DEBUG-NOT: LAA: Expanded RT check for range to include outer loop in order to permit hoisting

define void @diff_checks_src_start_invariant(ptr nocapture noundef writeonly %dst, ptr nocapture noundef readonly %src, i32 noundef %m, i32 noundef %n) {
Expand Down Expand Up @@ -508,7 +512,8 @@ outer.loop.exit:
; }
; }

; DEBUG-LABEL: LAA: Found a loop in full_checks_src_start_invariant:
; DEBUG-LABEL: 'full_checks_src_start_invariant'
; DEBUG: LAA: Found a loop: inner.loop
; DEBUG: LAA: Adding RT check for range:
; DEBUG-NEXT: LAA: Expanded RT check for range to include outer loop in order to permit hoisting
; DEBUG-NEXT: Start: %dst End: ((4 * (zext i32 %m to i64) * (zext i32 %n to i64)) + %dst)
Expand Down Expand Up @@ -629,7 +634,8 @@ outer.loop.exit:
; The 'src' access varies with the outermost loop, rather than the parent of the
; innermost loop. Hence we don't expand `src`, although in theory we could do.

; DEBUG-LABEL: LAA: Found a loop in triple_nested_loop_mixed_access:
; DEBUG-LABEL: 'triple_nested_loop_mixed_access'
; DEBUG: LAA: Found a loop: inner.loop
; DEBUG-NOT: LAA: Creating diff runtime check for:
; DEBUG: LAA: Adding RT check for range:
; DEBUG-NEXT: LAA: Expanded RT check for range to include outer loop in order to permit hoisting
Expand Down Expand Up @@ -795,7 +801,8 @@ exit:
; }
; Outer loop trip count is uncomputable so we shouldn't expand the ranges.

; DEBUG-LABEL: LAA: Found a loop in uncomputable_outer_tc:
; DEBUG-LABEL: 'uncomputable_outer_tc'
; DEBUG: LAA: Found a loop: inner.loop
; DEBUG: LAA: Adding RT check for range:
; DEBUG-NEXT: Start: {%dst,+,(4 * (zext i32 (1 + %n) to i64))<nuw><nsw>}<%outer.loop> End: {((4 * (zext i32 %n to i64))<nuw><nsw> + %dst),+,(4 * (zext i32 (1 + %n) to i64))<nuw><nsw>}<%outer.loop>
; DEBUG-NEXT: LAA: Adding RT check for range:
Expand Down Expand Up @@ -945,7 +952,8 @@ while.end:
; Inner IV is decreasing, but this isn't a problem and we can still expand the
; runtime checks correctly to cover the whole loop.

; DEBUG-LABEL: LAA: Found a loop in decreasing_inner_iv:
; DEBUG-LABEL: 'decreasing_inner_iv'
; DEBUG: LAA: Found a loop: inner.loop
; DEBUG: LAA: Adding RT check for range:
; DEBUG-NEXT: LAA: Expanded RT check for range to include outer loop in order to permit hoisting
; DEBUG-NEXT: LAA: ... but need to check stride is positive: (4 * (sext i32 %stride1 to i64))<nsw>
Expand Down Expand Up @@ -1111,7 +1119,8 @@ exit:
; Outer IV is decreasing, but the direction of memory accesses also depends
; upon the signedness of stride1.

; DEBUG-LABEL: LAA: Found a loop in decreasing_outer_iv:
; DEBUG-LABEL: 'decreasing_outer_iv'
; DEBUG: LAA: Found a loop: inner.loop
; DEBUG: LAA: Adding RT check for range:
; DEBUG-NEXT: LAA: Expanded RT check for range to include outer loop in order to permit hoisting
; DEBUG-NEXT: LAA: ... but need to check stride is positive: (-4 * (sext i32 %stride1 to i64))<nsw>
Expand Down Expand Up @@ -1271,7 +1280,8 @@ exit:
; }


; DEBUG-LABEL: LAA: Found a loop in unknown_inner_stride:
; DEBUG-LABEL: 'unknown_inner_stride'
; DEBUG: LAA: Found a loop: inner.loop
; DEBUG: LAA: Adding RT check for range:
; DEBUG-NEXT: LAA: Expanded RT check for range to include outer loop in order to permit hoisting
; DEBUG-NEXT: Start: %dst End: ((4 * (zext i32 %n to i64))<nuw><nsw> + (4 * (zext i32 (1 + %n) to i64) * (-1 + (zext i32 %m to i64))<nsw>) + %dst)
Expand Down