Skip to content

Commit 334380e

Browse files
steakhalsivan-shani
authored andcommitted
[clang][analysis] Fix flaky clang/test/Analysis/live-stmts.cpp test (llvm#126913)
Multiple people reported flaky bot failures tied to `clang/test/Analysis/live-stmts.cpp` I tried reproducing the flaky behavior on my Linux x86_64 system, but the tests appears to be stable in my context. Only by looking at the failures reported, I could formulate a potential diagnosis. The output always looked almost the same, except that the Exprs dumped per Basic block were shuffled compared to my expectation. This suggests to me some ordering issue. If you look at the backing storage of `blocksEndToLiveness[B].liveExprs`, it uses `llvm::ImmutableSet<const Expr *>`. That container likely uses the pointer values as keys, thus the runtime values of the addresses influence the iteration order. To fix this, before dumping, I sort the expressions by their "beginLocs". It should be efficient enough for a debug checker, where there is no performance constraint. This should hopefully fix the flaky behavior on systems where ASLR works differently than (my) Linux system. Hopefully fixes llvm#126619 Hopefully fixes llvm#126804
1 parent a52f7ad commit 334380e

File tree

2 files changed

+32
-24
lines changed

2 files changed

+32
-24
lines changed

clang/lib/Analysis/LiveVariables.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
#include "clang/Analysis/AnalysisDeclContext.h"
1717
#include "clang/Analysis/CFG.h"
1818
#include "clang/Analysis/FlowSensitive/DataflowWorklist.h"
19+
#include "clang/Basic/SourceManager.h"
1920
#include "llvm/ADT/DenseMap.h"
21+
#include "llvm/ADT/STLExtras.h"
2022
#include "llvm/Support/raw_ostream.h"
2123
#include <algorithm>
2224
#include <optional>
@@ -662,12 +664,19 @@ void LiveVariables::dumpExprLiveness(const SourceManager &M) {
662664
}
663665

664666
void LiveVariablesImpl::dumpExprLiveness(const SourceManager &M) {
667+
auto ByBeginLoc = [&M](const Expr *L, const Expr *R) {
668+
return M.isBeforeInTranslationUnit(L->getBeginLoc(), R->getBeginLoc());
669+
};
670+
665671
// Don't iterate over blockEndsToLiveness directly because it's not sorted.
666672
for (const CFGBlock *B : *analysisContext.getCFG()) {
667673

668674
llvm::errs() << "\n[ B" << B->getBlockID()
669675
<< " (live expressions at block exit) ]\n";
670-
for (const Expr *E : blocksEndToLiveness[B].liveExprs) {
676+
std::vector<const Expr *> LiveExprs;
677+
llvm::append_range(LiveExprs, blocksEndToLiveness[B].liveExprs);
678+
llvm::sort(LiveExprs, ByBeginLoc);
679+
for (const Expr *E : LiveExprs) {
671680
llvm::errs() << "\n";
672681
E->dump();
673682
}

clang/test/Analysis/live-stmts.cpp

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
// Flaky on aarch64: http://llvm.org/PR126619
2-
// UNSUPPORTED: target=aarch64{{.*}}
3-
41
// RUN: %clang_analyze_cc1 -w -analyzer-checker=debug.DumpLiveExprs %s 2>&1\
52
// RUN: | FileCheck %s
63

@@ -29,34 +26,36 @@ int testThatDumperWorks(int x, int y, int z) {
2926
// CHECK-EMPTY:
3027
// CHECK: [ B2 (live expressions at block exit) ]
3128
// CHECK-EMPTY:
32-
// CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int'
33-
// CHECK-EMPTY:
34-
// CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int'
35-
// CHECK-EMPTY:
3629
// CHECK-NEXT: ImplicitCastExpr {{.*}} <IntegralToBoolean>
3730
// CHECK-NEXT: `-ImplicitCastExpr {{.*}} <LValueToRValue>
3831
// CHECK-NEXT: `-DeclRefExpr {{.*}} 'x' 'int'
3932
// CHECK-EMPTY:
40-
// CHECK-EMPTY:
41-
// CHECK: [ B3 (live expressions at block exit) ]
42-
// CHECK-EMPTY:
4333
// CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int'
4434
// CHECK-EMPTY:
4535
// CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int'
4636
// CHECK-EMPTY:
37+
// CHECK-EMPTY:
38+
// CHECK: [ B3 (live expressions at block exit) ]
39+
// CHECK-EMPTY:
4740
// CHECK-NEXT: ImplicitCastExpr {{.*}} <IntegralToBoolean>
4841
// CHECK-NEXT: `-ImplicitCastExpr {{.*}} <LValueToRValue>
4942
// CHECK-NEXT: `-DeclRefExpr {{.*}} 'x' 'int'
50-
// CHECK: [ B4 (live expressions at block exit) ]
5143
// CHECK-EMPTY:
5244
// CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int'
5345
// CHECK-EMPTY:
5446
// CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int'
5547
// CHECK-EMPTY:
48+
// CHECK-EMPTY:
49+
// CHECK: [ B4 (live expressions at block exit) ]
50+
// CHECK-EMPTY:
5651
// CHECK-NEXT: ImplicitCastExpr {{.*}} <IntegralToBoolean>
5752
// CHECK-NEXT: `-ImplicitCastExpr {{.*}} <LValueToRValue>
5853
// CHECK-NEXT: `-DeclRefExpr {{.*}} 'x' 'int'
5954
// CHECK-EMPTY:
55+
// CHECK-NEXT: DeclRefExpr {{.*}} 'y' 'int'
56+
// CHECK-EMPTY:
57+
// CHECK-NEXT: DeclRefExpr {{.*}} 'z' 'int'
58+
// CHECK-EMPTY:
6059
// CHECK-EMPTY:
6160
// CHECK: [ B5 (live expressions at block exit) ]
6261
// CHECK-EMPTY:
@@ -226,15 +225,15 @@ int logicalOpInTernary(bool b) {
226225
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
227226
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
228227
// CHECK-EMPTY:
229-
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
230-
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
231-
// CHECK-EMPTY:
232228
// CHECK: BinaryOperator {{.*}} '_Bool' '||'
233229
// CHECK: |-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
234230
// CHECK: | `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
235231
// CHECK: `-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
236232
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
237233
// CHECK-EMPTY:
234+
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
235+
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
236+
// CHECK-EMPTY:
238237
// CHECK: IntegerLiteral {{.*}} 'int' 0
239238
// CHECK-EMPTY:
240239
// CHECK: IntegerLiteral {{.*}} 'int' 1
@@ -245,15 +244,15 @@ int logicalOpInTernary(bool b) {
245244
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
246245
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
247246
// CHECK-EMPTY:
248-
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
249-
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
250-
// CHECK-EMPTY:
251247
// CHECK: BinaryOperator {{.*}} '_Bool' '||'
252248
// CHECK: |-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
253249
// CHECK: | `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
254250
// CHECK: `-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
255251
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
256252
// CHECK-EMPTY:
253+
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
254+
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
255+
// CHECK-EMPTY:
257256
// CHECK: IntegerLiteral {{.*}} 'int' 0
258257
// CHECK-EMPTY:
259258
// CHECK: IntegerLiteral {{.*}} 'int' 1
@@ -264,15 +263,15 @@ int logicalOpInTernary(bool b) {
264263
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
265264
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
266265
// CHECK-EMPTY:
267-
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
268-
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
269-
// CHECK-EMPTY:
270266
// CHECK: BinaryOperator {{.*}} '_Bool' '||'
271267
// CHECK: |-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
272268
// CHECK: | `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
273269
// CHECK: `-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
274270
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
275271
// CHECK-EMPTY:
272+
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
273+
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
274+
// CHECK-EMPTY:
276275
// CHECK: IntegerLiteral {{.*}} 'int' 0
277276
// CHECK-EMPTY:
278277
// CHECK: IntegerLiteral {{.*}} 'int' 1
@@ -283,15 +282,15 @@ int logicalOpInTernary(bool b) {
283282
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
284283
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
285284
// CHECK-EMPTY:
286-
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
287-
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
288-
// CHECK-EMPTY:
289285
// CHECK: BinaryOperator {{.*}} '_Bool' '||'
290286
// CHECK: |-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
291287
// CHECK: | `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
292288
// CHECK: `-ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
293289
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
294290
// CHECK-EMPTY:
291+
// CHECK: ImplicitCastExpr {{.*}} '_Bool' <LValueToRValue>
292+
// CHECK: `-DeclRefExpr {{.*}} '_Bool' lvalue ParmVar {{.*}} 'b' '_Bool'
293+
// CHECK-EMPTY:
295294
// CHECK: IntegerLiteral {{.*}} 'int' 0
296295
// CHECK-EMPTY:
297296
// CHECK: IntegerLiteral {{.*}} 'int' 1

0 commit comments

Comments
 (0)