Skip to content

Commit b510b7c

Browse files
committed
Merge commit '6daa206b5d605e90b7e219d4efa0809f2ca2d29d' into feature/merge-upstream-20220325
2 parents dc6b451 + 6daa206 commit b510b7c

File tree

1,997 files changed

+127897
-45053
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,997 files changed

+127897
-45053
lines changed

bolt/lib/Passes/LoopInversionPass.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,16 @@ bool LoopInversionPass::runOnFunction(BinaryFunction &BF) {
5454
}
5555
}
5656

57-
assert(SecondSucc != nullptr && "Unable to find second BB successor");
58-
const uint64_t BBCount = SuccBB->getBranchInfo(*BB).Count;
59-
const uint64_t OtherCount = SuccBB->getBranchInfo(*SecondSucc).Count;
60-
if ((BBCount < OtherCount) && (BBIndex > SuccBBIndex))
57+
assert(SecondSucc != nullptr && "Unable to find a second BB successor");
58+
const uint64_t LoopCount = SuccBB->getBranchInfo(*BB).Count;
59+
const uint64_t ExitCount = SuccBB->getBranchInfo(*SecondSucc).Count;
60+
61+
if (LoopCount < ExitCount) {
62+
if (BBIndex > SuccBBIndex)
63+
continue;
64+
} else if (BBIndex < SuccBBIndex) {
6165
continue;
66+
}
6267

6368
IsChanged = true;
6469
BB->setLayoutIndex(SuccBBIndex);

bolt/test/X86/loop-inversion-pass.s

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,33 @@
44
# RUN: %s -o %t.o
55
# RUN: link_fdata %s %t.o %t.fdata
66
# RUN: link_fdata %s %t.o %t.fdata2 "FDATA2"
7+
# RUN: link_fdata %s %t.o %t.fdata3 "FDATA3"
78
# RUN: %clang %cflags %t.o -o %t.exe -Wl,-q
89
# RUN: llvm-bolt %t.exe -data %t.fdata -reorder-blocks=cache+ -print-finalized \
910
# RUN: -loop-inversion-opt -o %t.out | FileCheck %s
1011
# RUN: llvm-bolt %t.exe -data %t.fdata2 -reorder-blocks=cache+ -print-finalized \
1112
# RUN: -loop-inversion-opt -o %t.out2 | FileCheck --check-prefix="CHECK2" %s
13+
# RUN: llvm-bolt %t.exe -data %t.fdata3 -reorder-blocks=none -print-finalized \
14+
# RUN: -loop-inversion-opt -o %t.out3 | FileCheck --check-prefix="CHECK3" %s
1215

13-
# The case where loop is used:
16+
# The case where the loop is used:
1417
# FDATA: 1 main 2 1 main #.J1# 0 420
1518
# FDATA: 1 main b 1 main #.Jloop# 0 420
1619
# FDATA: 1 main b 1 main d 0 1
1720
# CHECK: BB Layout : .LBB00, .Ltmp0, .Ltmp1, .LFT0
1821

19-
# The case where loop is unused:
22+
# The case where the loop is unused:
2023
# FDATA2: 1 main 2 1 main #.J1# 0 420
2124
# FDATA2: 1 main b 1 main #.Jloop# 0 1
2225
# FDATA2: 1 main b 1 main d 0 420
2326
# CHECK2: BB Layout : .LBB00, .Ltmp1, .LFT0, .Ltmp0
2427

28+
# The case where the loop does not require rotation:
29+
# FDATA3: 1 main 2 1 main #.J1# 0 420
30+
# FDATA3: 1 main b 1 main #.Jloop# 0 420
31+
# FDATA3: 1 main b 1 main d 0 1
32+
# CHECK3: BB Layout : .LBB00, .Ltmp0, .Ltmp1, .LFT0
33+
2534
.text
2635
.globl main
2736
.type main, %function

clang-tools-extra/README.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ This repository is only intended to be checked out inside of a full LLVM+Clang
1111
tree, and in the 'tools/extra' subdirectory of the Clang checkout.
1212

1313
All discussion regarding Clang, Clang-based tools, and code in this repository
14-
should be held using the standard Clang mailing lists:
15-
http://lists.llvm.org/mailman/listinfo/cfe-dev
14+
should be held using the standard Clang forum:
15+
https://discourse.llvm.org/c/clang
1616

1717
Code review for this tree should take place on the standard Clang patch and
1818
commit lists:

clang-tools-extra/clang-tidy/abseil/CleanupCtadCheck.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ namespace clang {
2323
namespace tidy {
2424
namespace abseil {
2525

26-
RewriteRule CleanupCtadCheckImpl() {
26+
RewriteRuleWith<std::string> CleanupCtadCheckImpl() {
2727
auto warning_message = cat("prefer absl::Cleanup's class template argument "
2828
"deduction pattern in C++17 and higher");
2929

clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ using ::clang::transformer::cat;
3030
using ::clang::transformer::changeTo;
3131
using ::clang::transformer::makeRule;
3232
using ::clang::transformer::node;
33-
using ::clang::transformer::RewriteRule;
33+
using ::clang::transformer::RewriteRuleWith;
3434

3535
AST_MATCHER(Type, isCharType) { return Node.isCharType(); }
3636

@@ -39,7 +39,7 @@ static const char DefaultStringLikeClasses[] = "::std::basic_string;"
3939
"::absl::string_view";
4040
static const char DefaultAbseilStringsMatchHeader[] = "absl/strings/match.h";
4141

42-
static transformer::RewriteRule
42+
static transformer::RewriteRuleWith<std::string>
4343
makeRewriteRule(const std::vector<std::string> &StringLikeClassNames,
4444
StringRef AbseilStringsMatchHeader) {
4545
auto StringLikeClass = cxxRecordDecl(hasAnyName(SmallVector<StringRef, 4>(
@@ -62,7 +62,7 @@ makeRewriteRule(const std::vector<std::string> &StringLikeClassNames,
6262
hasArgument(1, cxxDefaultArgExpr())),
6363
onImplicitObjectArgument(expr().bind("string_being_searched")));
6464

65-
RewriteRule Rule = applyFirst(
65+
RewriteRuleWith<std::string> Rule = applyFirst(
6666
{makeRule(
6767
binaryOperator(hasOperatorName("=="),
6868
hasOperands(ignoringParenImpCasts(StringNpos),

clang-tools-extra/clang-tidy/bugprone/StringviewNullptrCheck.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ AST_MATCHER(clang::VarDecl, isDirectInitialization) {
3737

3838
} // namespace
3939

40-
RewriteRule StringviewNullptrCheckImpl() {
40+
RewriteRuleWith<std::string> StringviewNullptrCheckImpl() {
4141
auto construction_warning =
4242
cat("constructing basic_string_view from null is undefined; replace with "
4343
"the default constructor");

clang-tools-extra/clang-tidy/misc/RedundantExpressionCheck.cpp

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,7 @@ matchRelationalIntegerConstantExpr(StringRef Id) {
569569
std::string SwapId = (Id + "-swap").str();
570570
std::string NegateId = (Id + "-negate").str();
571571
std::string OverloadId = (Id + "-overload").str();
572+
std::string ConstId = (Id + "-const").str();
572573

573574
const auto RelationalExpr = ignoringParenImpCasts(binaryOperator(
574575
isComparisonOperator(), expr().bind(Id),
@@ -600,7 +601,9 @@ matchRelationalIntegerConstantExpr(StringRef Id) {
600601
cxxOperatorCallExpr(
601602
hasAnyOverloadedOperatorName("==", "!=", "<", "<=", ">", ">="),
602603
// Filter noisy false positives.
603-
unless(isMacro()), unless(isInTemplateInstantiation()))
604+
unless(isMacro()), unless(isInTemplateInstantiation()),
605+
anyOf(hasLHS(ignoringParenImpCasts(integerLiteral().bind(ConstId))),
606+
hasRHS(ignoringParenImpCasts(integerLiteral().bind(ConstId)))))
604607
.bind(OverloadId);
605608

606609
return anyOf(RelationalExpr, CastExpr, NegateRelationalExpr,
@@ -674,16 +677,38 @@ static bool retrieveRelationalIntegerConstantExpr(
674677
if (canOverloadedOperatorArgsBeModified(OverloadedOperatorExpr, false))
675678
return false;
676679

680+
bool IntegerConstantIsFirstArg = false;
681+
677682
if (const auto *Arg = OverloadedOperatorExpr->getArg(1)) {
678683
if (!Arg->isValueDependent() &&
679-
!Arg->isIntegerConstantExpr(*Result.Context))
680-
return false;
681-
}
682-
Symbol = OverloadedOperatorExpr->getArg(0);
684+
!Arg->isIntegerConstantExpr(*Result.Context)) {
685+
IntegerConstantIsFirstArg = true;
686+
if (const auto *Arg = OverloadedOperatorExpr->getArg(0)) {
687+
if (!Arg->isValueDependent() &&
688+
!Arg->isIntegerConstantExpr(*Result.Context))
689+
return false;
690+
} else
691+
return false;
692+
}
693+
} else
694+
return false;
695+
696+
Symbol = OverloadedOperatorExpr->getArg(IntegerConstantIsFirstArg ? 1 : 0);
683697
OperandExpr = OverloadedOperatorExpr;
684698
Opcode = BinaryOperator::getOverloadedOpcode(OverloadedOperatorExpr->getOperator());
685699

686-
return BinaryOperator::isComparisonOp(Opcode);
700+
if (!retrieveIntegerConstantExpr(Result, Id, Value, ConstExpr))
701+
return false;
702+
703+
if (!BinaryOperator::isComparisonOp(Opcode))
704+
return false;
705+
706+
// The call site of this function expects the constant on the RHS,
707+
// so change the opcode accordingly.
708+
if (IntegerConstantIsFirstArg)
709+
Opcode = BinaryOperator::reverseComparisonOp(Opcode);
710+
711+
return true;
687712
} else {
688713
return false;
689714
}

clang-tools-extra/clang-tidy/readability/MakeMemberFunctionConstCheck.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,13 @@ class FindUsageOfThis : public RecursiveASTVisitor<FindUsageOfThis> {
6666
return Parents.begin()->get<T>();
6767
}
6868

69+
const Expr *getParentExprIgnoreParens(const Expr *E) {
70+
const Expr *Parent = getParent<Expr>(E);
71+
while (isa_and_nonnull<ParenExpr>(Parent))
72+
Parent = getParent<Expr>(Parent);
73+
return Parent;
74+
}
75+
6976
bool VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *) {
7077
// An UnresolvedMemberExpr might resolve to a non-const non-static
7178
// member function.
@@ -140,7 +147,7 @@ class FindUsageOfThis : public RecursiveASTVisitor<FindUsageOfThis> {
140147
return true;
141148
}
142149

143-
const auto *Parent = getParent<Expr>(Member);
150+
const auto *Parent = getParentExprIgnoreParens(Member);
144151

145152
if (const auto *Cast = dyn_cast_or_null<ImplicitCastExpr>(Parent)) {
146153
// A read access to a member is safe when the member either
@@ -167,12 +174,12 @@ class FindUsageOfThis : public RecursiveASTVisitor<FindUsageOfThis> {
167174
bool VisitCXXThisExpr(const CXXThisExpr *E) {
168175
Usage = Const;
169176

170-
const auto *Parent = getParent<Expr>(E);
177+
const auto *Parent = getParentExprIgnoreParens(E);
171178

172179
// Look through deref of this.
173180
if (const auto *UnOp = dyn_cast_or_null<UnaryOperator>(Parent)) {
174181
if (UnOp->getOpcode() == UO_Deref) {
175-
Parent = getParent<Expr>(UnOp);
182+
Parent = getParentExprIgnoreParens(UnOp);
176183
}
177184
}
178185

clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,16 @@
1313
namespace clang {
1414
namespace tidy {
1515
namespace utils {
16-
using transformer::RewriteRule;
16+
using transformer::RewriteRuleWith;
1717

1818
#ifndef NDEBUG
19-
static bool hasExplanation(const RewriteRule::Case &C) {
20-
return C.Explanation != nullptr;
19+
static bool hasGenerator(const transformer::Generator<std::string> &G) {
20+
return G != nullptr;
2121
}
2222
#endif
2323

24-
static void verifyRule(const RewriteRule &Rule) {
25-
assert(llvm::all_of(Rule.Cases, hasExplanation) &&
24+
static void verifyRule(const RewriteRuleWith<std::string> &Rule) {
25+
assert(llvm::all_of(Rule.Metadata, hasGenerator) &&
2626
"clang-tidy checks must have an explanation by default;"
2727
" explicitly provide an empty explanation if none is desired");
2828
}
@@ -39,23 +39,24 @@ TransformerClangTidyCheck::TransformerClangTidyCheck(StringRef Name,
3939
// we would be accessing `getLangOpts` and `Options` before the underlying
4040
// `ClangTidyCheck` instance was properly initialized.
4141
TransformerClangTidyCheck::TransformerClangTidyCheck(
42-
std::function<Optional<RewriteRule>(const LangOptions &,
43-
const OptionsView &)>
42+
std::function<Optional<RewriteRuleWith<std::string>>(const LangOptions &,
43+
const OptionsView &)>
4444
MakeRule,
4545
StringRef Name, ClangTidyContext *Context)
4646
: TransformerClangTidyCheck(Name, Context) {
47-
if (Optional<RewriteRule> R = MakeRule(getLangOpts(), Options))
47+
if (Optional<RewriteRuleWith<std::string>> R =
48+
MakeRule(getLangOpts(), Options))
4849
setRule(std::move(*R));
4950
}
5051

51-
TransformerClangTidyCheck::TransformerClangTidyCheck(RewriteRule R,
52-
StringRef Name,
53-
ClangTidyContext *Context)
52+
TransformerClangTidyCheck::TransformerClangTidyCheck(
53+
RewriteRuleWith<std::string> R, StringRef Name, ClangTidyContext *Context)
5454
: TransformerClangTidyCheck(Name, Context) {
5555
setRule(std::move(R));
5656
}
5757

58-
void TransformerClangTidyCheck::setRule(transformer::RewriteRule R) {
58+
void TransformerClangTidyCheck::setRule(
59+
transformer::RewriteRuleWith<std::string> R) {
5960
verifyRule(R);
6061
Rule = std::move(R);
6162
}
@@ -77,8 +78,9 @@ void TransformerClangTidyCheck::check(
7778
if (Result.Context->getDiagnostics().hasErrorOccurred())
7879
return;
7980

80-
RewriteRule::Case Case = transformer::detail::findSelectedCase(Result, Rule);
81-
Expected<SmallVector<transformer::Edit, 1>> Edits = Case.Edits(Result);
81+
size_t I = transformer::detail::findSelectedCase(Result, Rule);
82+
Expected<SmallVector<transformer::Edit, 1>> Edits =
83+
Rule.Cases[I].Edits(Result);
8284
if (!Edits) {
8385
llvm::errs() << "Rewrite failed: " << llvm::toString(Edits.takeError())
8486
<< "\n";
@@ -89,7 +91,7 @@ void TransformerClangTidyCheck::check(
8991
if (Edits->empty())
9092
return;
9193

92-
Expected<std::string> Explanation = Case.Explanation->eval(Result);
94+
Expected<std::string> Explanation = Rule.Metadata[I]->eval(Result);
9395
if (!Explanation) {
9496
llvm::errs() << "Error in explanation: "
9597
<< llvm::toString(Explanation.takeError()) << "\n";

clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,16 @@ class TransformerClangTidyCheck : public ClangTidyCheck {
4848
/// cases where the options disable the check.
4949
///
5050
/// See \c setRule for constraints on the rule.
51-
TransformerClangTidyCheck(std::function<Optional<transformer::RewriteRule>(
52-
const LangOptions &, const OptionsView &)>
53-
MakeRule,
54-
StringRef Name, ClangTidyContext *Context);
51+
TransformerClangTidyCheck(
52+
std::function<Optional<transformer::RewriteRuleWith<std::string>>(
53+
const LangOptions &, const OptionsView &)>
54+
MakeRule,
55+
StringRef Name, ClangTidyContext *Context);
5556

5657
/// Convenience overload of the constructor when the rule doesn't have any
5758
/// dependencies.
58-
TransformerClangTidyCheck(transformer::RewriteRule R, StringRef Name,
59-
ClangTidyContext *Context);
59+
TransformerClangTidyCheck(transformer::RewriteRuleWith<std::string> R,
60+
StringRef Name, ClangTidyContext *Context);
6061

6162
void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
6263
Preprocessor *ModuleExpanderPP) override;
@@ -74,10 +75,10 @@ class TransformerClangTidyCheck : public ClangTidyCheck {
7475
/// is a bug. If no explanation is desired, indicate that explicitly (for
7576
/// example, by passing `text("no explanation")` to `makeRule` as the
7677
/// `Explanation` argument).
77-
void setRule(transformer::RewriteRule R);
78+
void setRule(transformer::RewriteRuleWith<std::string> R);
7879

7980
private:
80-
transformer::RewriteRule Rule;
81+
transformer::RewriteRuleWith<std::string> Rule;
8182
IncludeInserter Inserter;
8283
};
8384

0 commit comments

Comments
 (0)