diff --git a/include/llvm/Analysis/LoopAccessAnalysis.h b/include/llvm/Analysis/LoopAccessAnalysis.h index 731cb5dabc9..716e18f7bb1 100644 --- a/include/llvm/Analysis/LoopAccessAnalysis.h +++ b/include/llvm/Analysis/LoopAccessAnalysis.h @@ -414,6 +414,10 @@ public: void print(raw_ostream &OS, unsigned Depth = 0, const SmallVectorImpl *PtrPartition = nullptr) const; + /// Print \p Checks. + void printChecks(raw_ostream &OS, const SmallVectorImpl &Checks, + unsigned Depth = 0) const; + /// This flag indicates if we need to add the runtime check. bool Need; diff --git a/lib/Analysis/LoopAccessAnalysis.cpp b/lib/Analysis/LoopAccessAnalysis.cpp index b66087f4fc4..6a6b6d4be3b 100644 --- a/lib/Analysis/LoopAccessAnalysis.cpp +++ b/lib/Analysis/LoopAccessAnalysis.cpp @@ -344,48 +344,41 @@ bool RuntimePointerChecking::needsChecking( return true; } +void RuntimePointerChecking::printChecks( + raw_ostream &OS, const SmallVectorImpl &Checks, + unsigned Depth) const { + unsigned N = 0; + for (const auto &Check : Checks) { + const auto &First = Check.first->Members, &Second = Check.second->Members; + + OS.indent(Depth) << "Check " << N++ << ":\n"; + + OS.indent(Depth + 2) << "Comparing group (" << Check.first << "):\n"; + for (unsigned K = 0; K < First.size(); ++K) + OS.indent(Depth + 2) << *Pointers[First[K]].PointerValue << "\n"; + + OS.indent(Depth + 2) << "Against group (" << Check.second << "):\n"; + for (unsigned K = 0; K < Second.size(); ++K) + OS.indent(Depth + 2) << *Pointers[Second[K]].PointerValue << "\n"; + } +} + void RuntimePointerChecking::print( raw_ostream &OS, unsigned Depth, const SmallVectorImpl *PtrPartition) const { OS.indent(Depth) << "Run-time memory checks:\n"; - - unsigned N = 0; - for (unsigned I = 0; I < CheckingGroups.size(); ++I) - for (unsigned J = I + 1; J < CheckingGroups.size(); ++J) - if (needsChecking(CheckingGroups[I], CheckingGroups[J], PtrPartition)) { - OS.indent(Depth) << "Check " << N++ << ":\n"; - OS.indent(Depth + 2) << "Comparing group " << I << ":\n"; - - for (unsigned K = 0; K < CheckingGroups[I].Members.size(); ++K) { - OS.indent(Depth + 2) - << *Pointers[CheckingGroups[I].Members[K]].PointerValue << "\n"; - if (PtrPartition) - OS << " (Partition: " - << (*PtrPartition)[CheckingGroups[I].Members[K]] << ")" - << "\n"; - } - - OS.indent(Depth + 2) << "Against group " << J << ":\n"; - - for (unsigned K = 0; K < CheckingGroups[J].Members.size(); ++K) { - OS.indent(Depth + 2) - << *Pointers[CheckingGroups[J].Members[K]].PointerValue << "\n"; - if (PtrPartition) - OS << " (Partition: " - << (*PtrPartition)[CheckingGroups[J].Members[K]] << ")" - << "\n"; - } - } + printChecks(OS, generateChecks(PtrPartition), Depth); OS.indent(Depth) << "Grouped accesses:\n"; for (unsigned I = 0; I < CheckingGroups.size(); ++I) { - OS.indent(Depth + 2) << "Group " << I << ":\n"; - OS.indent(Depth + 4) << "(Low: " << *CheckingGroups[I].Low - << " High: " << *CheckingGroups[I].High << ")\n"; - for (unsigned J = 0; J < CheckingGroups[I].Members.size(); ++J) { - OS.indent(Depth + 6) << "Member: " - << *Pointers[CheckingGroups[I].Members[J]].Expr + const auto &CG = CheckingGroups[I]; + + OS.indent(Depth + 2) << "Group " << &CG << ":\n"; + OS.indent(Depth + 4) << "(Low: " << *CG.Low << " High: " << *CG.High + << ")\n"; + for (unsigned J = 0; J < CG.Members.size(); ++J) { + OS.indent(Depth + 6) << "Member: " << *Pointers[CG.Members[J]].Expr << "\n"; } } diff --git a/test/Analysis/LoopAccessAnalysis/number-of-memchecks.ll b/test/Analysis/LoopAccessAnalysis/number-of-memchecks.ll index 50b37a031a6..ab9abd7c60a 100644 --- a/test/Analysis/LoopAccessAnalysis/number-of-memchecks.ll +++ b/test/Analysis/LoopAccessAnalysis/number-of-memchecks.ll @@ -81,28 +81,28 @@ for.end: ; preds = %for.body ; CHECK: Run-time memory checks: ; CHECK-NEXT: Check 0: -; CHECK-NEXT: Comparing group 0: +; CHECK-NEXT: Comparing group ([[ZERO:.+]]): ; CHECK-NEXT: %arrayidxC1 = getelementptr inbounds i16, i16* %c, i64 %store_ind_inc ; CHECK-NEXT: %arrayidxC = getelementptr inbounds i16, i16* %c, i64 %store_ind -; CHECK-NEXT: Against group 1: +; CHECK-NEXT: Against group ([[ONE:.+]]): ; CHECK-NEXT: %arrayidxA1 = getelementptr inbounds i16, i16* %a, i64 %add ; CHECK-NEXT: %arrayidxA = getelementptr inbounds i16, i16* %a, i64 %ind ; CHECK-NEXT: Check 1: -; CHECK-NEXT: Comparing group 0: +; CHECK-NEXT: Comparing group ({{.*}}[[ZERO]]): ; CHECK-NEXT: %arrayidxC1 = getelementptr inbounds i16, i16* %c, i64 %store_ind_inc ; CHECK-NEXT: %arrayidxC = getelementptr inbounds i16, i16* %c, i64 %store_ind -; CHECK-NEXT: Against group 2: +; CHECK-NEXT: Against group ([[TWO:.+]]): ; CHECK-NEXT: %arrayidxB = getelementptr inbounds i16, i16* %b, i64 %ind ; CHECK-NEXT: Grouped accesses: -; CHECK-NEXT: Group 0: +; CHECK-NEXT: Group {{.*}}[[ZERO]]: ; CHECK-NEXT: (Low: %c High: (78 + %c)) ; CHECK-NEXT: Member: {(2 + %c),+,4} ; CHECK-NEXT: Member: {%c,+,4} -; CHECK-NEXT: Group 1: +; CHECK-NEXT: Group {{.*}}[[ONE]]: ; CHECK-NEXT: (Low: %a High: (40 + %a)) ; CHECK-NEXT: Member: {(2 + %a),+,2} ; CHECK-NEXT: Member: {%a,+,2} -; CHECK-NEXT: Group 2: +; CHECK-NEXT: Group {{.*}}[[TWO]]: ; CHECK-NEXT: (Low: %b High: (38 + %b)) ; CHECK-NEXT: Member: {%b,+,2} @@ -153,28 +153,28 @@ for.end: ; preds = %for.body ; CHECK: function 'testh': ; CHECK: Run-time memory checks: ; CHECK-NEXT: Check 0: -; CHECK-NEXT: Comparing group 0: +; CHECK-NEXT: Comparing group ([[ZERO:.+]]): ; CHECK-NEXT: %arrayidxC1 = getelementptr inbounds i16, i16* %c, i64 %store_ind_inc ; CHECK-NEXT: %arrayidxC = getelementptr inbounds i16, i16* %c, i64 %store_ind -; CHECK-NEXT: Against group 1: +; CHECK-NEXT: Against group ([[ONE:.+]]): ; CHECK-NEXT: %arrayidxA1 = getelementptr i16, i16* %a, i64 %add ; CHECK-NEXT: %arrayidxA = getelementptr i16, i16* %a, i64 %ind ; CHECK-NEXT: Check 1: -; CHECK-NEXT: Comparing group 0: +; CHECK-NEXT: Comparing group ({{.*}}[[ZERO]]): ; CHECK-NEXT: %arrayidxC1 = getelementptr inbounds i16, i16* %c, i64 %store_ind_inc ; CHECK-NEXT: %arrayidxC = getelementptr inbounds i16, i16* %c, i64 %store_ind -; CHECK-NEXT: Against group 2: +; CHECK-NEXT: Against group ([[TWO:.+]]): ; CHECK-NEXT: %arrayidxB = getelementptr i16, i16* %b, i64 %ind ; CHECK-NEXT: Grouped accesses: -; CHECK-NEXT: Group 0: +; CHECK-NEXT: Group {{.*}}[[ZERO]]: ; CHECK-NEXT: (Low: %c High: (78 + %c)) ; CHECK-NEXT: Member: {(2 + %c),+,4} ; CHECK-NEXT: Member: {%c,+,4} -; CHECK-NEXT: Group 1: +; CHECK-NEXT: Group {{.*}}[[ONE]]: ; CHECK-NEXT: (Low: %a High: (40 + %a)) ; CHECK-NEXT: Member: {(2 + %a),+,2} ; CHECK-NEXT: Member: {%a,+,2} -; CHECK-NEXT: Group 2: +; CHECK-NEXT: Group {{.*}}[[TWO]]: ; CHECK-NEXT: (Low: %b High: (38 + %b)) ; CHECK-NEXT: Member: {%b,+,2} @@ -230,23 +230,23 @@ for.end: ; preds = %for.body ; CHECK: function 'testi': ; CHECK: Run-time memory checks: ; CHECK-NEXT: Check 0: -; CHECK-NEXT: Comparing group 0: +; CHECK-NEXT: Comparing group ([[ZERO:.+]]): ; CHECK-NEXT: %storeidx = getelementptr inbounds i16, i16* %a, i64 %store_ind -; CHECK-NEXT: Against group 1: +; CHECK-NEXT: Against group ([[ONE:.+]]): ; CHECK-NEXT: %arrayidxA1 = getelementptr i16, i16* %a, i64 %ind ; CHECK-NEXT: Check 1: -; CHECK-NEXT: Comparing group 0: +; CHECK-NEXT: Comparing group ({{.*}}[[ZERO]]): ; CHECK-NEXT: %storeidx = getelementptr inbounds i16, i16* %a, i64 %store_ind -; CHECK-NEXT: Against group 2: +; CHECK-NEXT: Against group ([[TWO:.+]]): ; CHECK-NEXT: %arrayidxA2 = getelementptr i16, i16* %a, i64 %ind2 ; CHECK-NEXT: Grouped accesses: -; CHECK-NEXT: Group 0: +; CHECK-NEXT: Group {{.*}}[[ZERO]]: ; CHECK-NEXT: (Low: ((2 * %offset) + %a) High: (9998 + (2 * %offset) + %a)) ; CHECK-NEXT: Member: {((2 * %offset) + %a),+,2}<%for.body> -; CHECK-NEXT: Group 1: +; CHECK-NEXT: Group {{.*}}[[ONE]]: ; CHECK-NEXT: (Low: %a High: (9998 + %a)) ; CHECK-NEXT: Member: {%a,+,2}<%for.body> -; CHECK-NEXT: Group 2: +; CHECK-NEXT: Group {{.*}}[[TWO]]: ; CHECK-NEXT: (Low: (20000 + %a) High: (29998 + %a)) ; CHECK-NEXT: Member: {(20000 + %a),+,2}<%for.body>