Skip to content

Commit bb48233

Browse files
committed
[Profiler] Avoid recording empty regions
These are redundant.
1 parent 509a781 commit bb48233

File tree

4 files changed

+37
-20
lines changed

4 files changed

+37
-20
lines changed

lib/SIL/IR/SILProfiler.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,11 @@ class SourceMappingRegion {
582582
return *EndLoc;
583583
}
584584

585+
/// Whether the region has a non-empty range.
586+
bool hasNonEmptyRange() const {
587+
return StartLoc && EndLoc && *StartLoc != *EndLoc;
588+
}
589+
585590
void print(llvm::raw_ostream &OS, const SourceManager &SM) const {
586591
OS << "[";
587592
if (hasStartLoc())
@@ -1006,6 +1011,7 @@ struct CoverageMapping : public ASTWalker {
10061011
assert(I != E && "parent not in stack");
10071012
auto ParentIt = I;
10081013
SourceLoc EndLoc = ParentIt->getEndLoc();
1014+
assert(ParentIt->hasNonEmptyRange() && "Pushed node with empty range?");
10091015

10101016
unsigned FirstPoppedIndex = SourceRegions.size();
10111017
(void)FirstPoppedIndex;
@@ -1015,6 +1021,12 @@ struct CoverageMapping : public ASTWalker {
10151021
continue;
10161022
if (!I->hasEndLoc())
10171023
I->setEndLoc(EndLoc);
1024+
1025+
// If the range ended up being empty, ignore it (this can happen when we
1026+
// replace the counter, and don't extend the region any further).
1027+
if (!I->hasNonEmptyRange())
1028+
continue;
1029+
10181030
SourceRegions.push_back(std::move(*I));
10191031
}
10201032

test/Profiler/coverage_switch.swift

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,17 +51,18 @@ enum Algebraic {
5151
func nop() {}
5252

5353
// CHECK-LABEL: sil_coverage_map {{.*}}// coverage_switch.f2
54-
func f2(_ x : Algebraic) -> Int32 { // CHECK-NEXT: [[@LINE]]:35 -> [[@LINE+15]]:2 : 0
54+
func f2(_ x : Algebraic) -> Int32 { // CHECK-NEXT: [[@LINE]]:35 -> [[@LINE+16]]:2 : 0
5555
switch(x) { // CHECK-NEXT: [[@LINE]]:9 -> [[@LINE]]:12 : 0
5656
case let .Type1(y, z): // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+1]]:10 : 1
5757
nop()
5858
case .Type2(let b): // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+2]]:16 : 2
5959
nop()
6060
fallthrough
61-
case .Type3: // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+3]]:6 : (2 + 3)
61+
case .Type3: // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+4]]:7 : (2 + 3)
6262
if (false) { // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE]]:15 : (2 + 3)
6363
fallthrough // CHECK-NEXT: [[@LINE-1]]:16 -> [[@LINE+1]]:6 : 4
64-
} // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE]]:6 : ((2 + 3) - 4)
64+
} // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE+1]]:7 : ((2 + 3) - 4)
65+
() // Here to make sure this region is non empty ^
6566
case .Type4: // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+1]]:10 : (4 + 5)
6667
break
6768
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+1]]:11 : (((1 + 2) + 3) + 5)
@@ -91,23 +92,25 @@ f2(Algebraic.Type3)
9192
f3(Simple.Second)
9293

9394
// CHECK-LABEL: sil_coverage_map {{.*}}// coverage_switch.f4
94-
func f4(_ x: Int) throws -> Int { // CHECK-NEXT: [[@LINE]]:33 -> [[@LINE+21]]:2 : 0
95-
y: do { // CHECK-NEXT: [[@LINE]]:9 -> [[@LINE+18]]:4 : 0
95+
func f4(_ x: Int) throws -> Int { // CHECK-NEXT: [[@LINE]]:33 -> [[@LINE+23]]:2 : 0
96+
y: do { // CHECK-NEXT: [[@LINE]]:9 -> [[@LINE+20]]:4 : 0
9697
switch x { // CHECK-NEXT: [[@LINE]]:12 -> [[@LINE]]:13 : 0
9798
case 1, 2, 3: // CHECK-NEXT: [[@LINE]]:5 -> [[@LINE+4]]:18 : 1
9899
if .random() { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE]]:19 : 1
99100
return 5 // CHECK-NEXT: [[@LINE-1]]:20 -> [[@LINE+1]]:8 : 2
100101
} // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE+1]]:18 : (1 - 2)
101102
fallthrough
102-
case 4: // CHECK-NEXT: [[@LINE]]:5 -> [[@LINE+4]]:8 : ((1 + 3) - 2)
103+
case 4: // CHECK-NEXT: [[@LINE]]:5 -> [[@LINE+5]]:9 : ((1 + 3) - 2)
103104
if .random() { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE]]:19 : ((1 + 3) - 2)
104105
struct E : Error {} // CHECK-NEXT: [[@LINE-1]]:20 -> [[@LINE+2]]:8 : 4
105106
throw E()
106-
} // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE]]:8 : (((1 + 3) - 2) - 4)
107-
default: // CHECK-NEXT: [[@LINE]]:5 -> [[@LINE+3]]:8 : 5
107+
} // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE+1]]:9 : (((1 + 3) - 2) - 4)
108+
() // Here to make sure this region is non empty ^
109+
default: // CHECK-NEXT: [[@LINE]]:5 -> [[@LINE+4]]:9 : 5
108110
if .random() { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE]]:19 : 5
109111
break y // CHECK-NEXT: [[@LINE-1]]:20 -> [[@LINE+1]]:8 : 6
110-
} // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE]]:8 : (5 - 6)
112+
} // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE+1]]:9 : (5 - 6)
113+
() // Here to make sure this region is non empty ^
111114
}
112115
f1(0) // CHECK-NEXT: [[@LINE-1]]:6 -> [[@LINE+1]]:4 : (((((1 + 3) + 5) - 2) - 4) - 6)
113116
}

test/Profiler/coverage_toplevel.swift

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,9 @@ func f1() {}
1717
// CHECK-NEXT: [[@LINE+1]]:1 -> [[@LINE+1]]:18 : 1
1818
var i : Int32 = 0
1919

20-
// CHECK-NEXT: [[@LINE+4]]:1 -> [[@LINE+6]]:2 : 2
21-
// CHECK-NEXT: [[@LINE+3]]:7 -> [[@LINE+3]]:15 : (2 + 3)
22-
// CHECK-NEXT: [[@LINE+2]]:16 -> [[@LINE+4]]:2 : 3
23-
// CHECK-NEXT: [[@LINE+3]]:2 -> [[@LINE+3]]:2 : 2
20+
// CHECK-NEXT: [[@LINE+3]]:1 -> [[@LINE+5]]:2 : 2
21+
// CHECK-NEXT: [[@LINE+2]]:7 -> [[@LINE+2]]:15 : (2 + 3)
22+
// CHECK-NEXT: [[@LINE+1]]:16 -> [[@LINE+3]]:2 : 3
2423
while (i < 10) {
2524
i += 1
2625
}
@@ -30,10 +29,9 @@ while (i < 10) {
3029
// CHECK-NEXT: [[@LINE+1]]:21 -> [[@LINE+1]]:22 : (4 - 5)
3130
var i2 = true ? 1 : 0;
3231

33-
// CHECK-NEXT: [[@LINE+4]]:1 -> [[@LINE+6]]:2 : 6
34-
// CHECK-NEXT: [[@LINE+3]]:4 -> [[@LINE+3]]:10 : 6
35-
// CHECK-NEXT: [[@LINE+2]]:11 -> [[@LINE+4]]:2 : 7
36-
// CHECK-NEXT: [[@LINE+3]]:2 -> [[@LINE+3]]:2 : 6
32+
// CHECK-NEXT: [[@LINE+3]]:1 -> [[@LINE+5]]:2 : 6
33+
// CHECK-NEXT: [[@LINE+2]]:4 -> [[@LINE+2]]:10 : 6
34+
// CHECK-NEXT: [[@LINE+1]]:11 -> [[@LINE+3]]:2 : 7
3735
if (true) {
3836
i2 = 2
3937
}

test/Profiler/coverage_while.swift

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,10 @@ func goo() {
123123
} while false // CHECK-DAG: [[@LINE]]:11 -> [[@LINE]]:16 : ([[RWS8]] - [[RET1]])
124124
}
125125

126-
eoo()
127-
foo()
128-
goo()
126+
// CHECK-LABEL: sil_coverage_map {{.*}}// coverage_while.hoo
127+
func hoo() { // CHECK-NEXT: [[@LINE]]:12 -> [[@LINE+5]]:2 : 0
128+
var i: Int = 0
129+
while (i < 10) { // CHECK-NEXT: [[@LINE]]:9 -> [[@LINE]]:17 : (0 + 1)
130+
i += 1 // CHECK-NEXT: [[@LINE-1]]:18 -> [[@LINE+1]]:4 : 1
131+
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+1]]:2 : 0
132+
}

0 commit comments

Comments
 (0)