[Profiler] Avoid recording empty regions

These are redundant.
This commit is contained in:
Hamish Knight
2023-11-16 17:28:57 +00:00
parent 509a78102b
commit bb48233695
4 changed files with 37 additions and 20 deletions

View File

@@ -582,6 +582,11 @@ public:
return *EndLoc; return *EndLoc;
} }
/// Whether the region has a non-empty range.
bool hasNonEmptyRange() const {
return StartLoc && EndLoc && *StartLoc != *EndLoc;
}
void print(llvm::raw_ostream &OS, const SourceManager &SM) const { void print(llvm::raw_ostream &OS, const SourceManager &SM) const {
OS << "["; OS << "[";
if (hasStartLoc()) if (hasStartLoc())
@@ -1006,6 +1011,7 @@ private:
assert(I != E && "parent not in stack"); assert(I != E && "parent not in stack");
auto ParentIt = I; auto ParentIt = I;
SourceLoc EndLoc = ParentIt->getEndLoc(); SourceLoc EndLoc = ParentIt->getEndLoc();
assert(ParentIt->hasNonEmptyRange() && "Pushed node with empty range?");
unsigned FirstPoppedIndex = SourceRegions.size(); unsigned FirstPoppedIndex = SourceRegions.size();
(void)FirstPoppedIndex; (void)FirstPoppedIndex;
@@ -1015,6 +1021,12 @@ private:
continue; continue;
if (!I->hasEndLoc()) if (!I->hasEndLoc())
I->setEndLoc(EndLoc); I->setEndLoc(EndLoc);
// If the range ended up being empty, ignore it (this can happen when we
// replace the counter, and don't extend the region any further).
if (!I->hasNonEmptyRange())
continue;
SourceRegions.push_back(std::move(*I)); SourceRegions.push_back(std::move(*I));
} }

View File

@@ -51,17 +51,18 @@ enum Algebraic {
func nop() {} func nop() {}
// CHECK-LABEL: sil_coverage_map {{.*}}// coverage_switch.f2 // CHECK-LABEL: sil_coverage_map {{.*}}// coverage_switch.f2
func f2(_ x : Algebraic) -> Int32 { // CHECK-NEXT: [[@LINE]]:35 -> [[@LINE+15]]:2 : 0 func f2(_ x : Algebraic) -> Int32 { // CHECK-NEXT: [[@LINE]]:35 -> [[@LINE+16]]:2 : 0
switch(x) { // CHECK-NEXT: [[@LINE]]:9 -> [[@LINE]]:12 : 0 switch(x) { // CHECK-NEXT: [[@LINE]]:9 -> [[@LINE]]:12 : 0
case let .Type1(y, z): // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+1]]:10 : 1 case let .Type1(y, z): // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+1]]:10 : 1
nop() nop()
case .Type2(let b): // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+2]]:16 : 2 case .Type2(let b): // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+2]]:16 : 2
nop() nop()
fallthrough fallthrough
case .Type3: // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+3]]:6 : (2 + 3) case .Type3: // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+4]]:7 : (2 + 3)
if (false) { // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE]]:15 : (2 + 3) if (false) { // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE]]:15 : (2 + 3)
fallthrough // CHECK-NEXT: [[@LINE-1]]:16 -> [[@LINE+1]]:6 : 4 fallthrough // CHECK-NEXT: [[@LINE-1]]:16 -> [[@LINE+1]]:6 : 4
} // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE]]:6 : ((2 + 3) - 4) } // CHECK-NEXT: [[@LINE]]:6 -> [[@LINE+1]]:7 : ((2 + 3) - 4)
() // Here to make sure this region is non empty ^
case .Type4: // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+1]]:10 : (4 + 5) case .Type4: // CHECK-NEXT: [[@LINE]]:3 -> [[@LINE+1]]:10 : (4 + 5)
break break
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+1]]:11 : (((1 + 2) + 3) + 5) } // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+1]]:11 : (((1 + 2) + 3) + 5)
@@ -91,23 +92,25 @@ f2(Algebraic.Type3)
f3(Simple.Second) f3(Simple.Second)
// CHECK-LABEL: sil_coverage_map {{.*}}// coverage_switch.f4 // CHECK-LABEL: sil_coverage_map {{.*}}// coverage_switch.f4
func f4(_ x: Int) throws -> Int { // CHECK-NEXT: [[@LINE]]:33 -> [[@LINE+21]]:2 : 0 func f4(_ x: Int) throws -> Int { // CHECK-NEXT: [[@LINE]]:33 -> [[@LINE+23]]:2 : 0
y: do { // CHECK-NEXT: [[@LINE]]:9 -> [[@LINE+18]]:4 : 0 y: do { // CHECK-NEXT: [[@LINE]]:9 -> [[@LINE+20]]:4 : 0
switch x { // CHECK-NEXT: [[@LINE]]:12 -> [[@LINE]]:13 : 0 switch x { // CHECK-NEXT: [[@LINE]]:12 -> [[@LINE]]:13 : 0
case 1, 2, 3: // CHECK-NEXT: [[@LINE]]:5 -> [[@LINE+4]]:18 : 1 case 1, 2, 3: // CHECK-NEXT: [[@LINE]]:5 -> [[@LINE+4]]:18 : 1
if .random() { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE]]:19 : 1 if .random() { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE]]:19 : 1
return 5 // CHECK-NEXT: [[@LINE-1]]:20 -> [[@LINE+1]]:8 : 2 return 5 // CHECK-NEXT: [[@LINE-1]]:20 -> [[@LINE+1]]:8 : 2
} // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE+1]]:18 : (1 - 2) } // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE+1]]:18 : (1 - 2)
fallthrough fallthrough
case 4: // CHECK-NEXT: [[@LINE]]:5 -> [[@LINE+4]]:8 : ((1 + 3) - 2) case 4: // CHECK-NEXT: [[@LINE]]:5 -> [[@LINE+5]]:9 : ((1 + 3) - 2)
if .random() { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE]]:19 : ((1 + 3) - 2) if .random() { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE]]:19 : ((1 + 3) - 2)
struct E : Error {} // CHECK-NEXT: [[@LINE-1]]:20 -> [[@LINE+2]]:8 : 4 struct E : Error {} // CHECK-NEXT: [[@LINE-1]]:20 -> [[@LINE+2]]:8 : 4
throw E() throw E()
} // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE]]:8 : (((1 + 3) - 2) - 4) } // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE+1]]:9 : (((1 + 3) - 2) - 4)
default: // CHECK-NEXT: [[@LINE]]:5 -> [[@LINE+3]]:8 : 5 () // Here to make sure this region is non empty ^
default: // CHECK-NEXT: [[@LINE]]:5 -> [[@LINE+4]]:9 : 5
if .random() { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE]]:19 : 5 if .random() { // CHECK-NEXT: [[@LINE]]:10 -> [[@LINE]]:19 : 5
break y // CHECK-NEXT: [[@LINE-1]]:20 -> [[@LINE+1]]:8 : 6 break y // CHECK-NEXT: [[@LINE-1]]:20 -> [[@LINE+1]]:8 : 6
} // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE]]:8 : (5 - 6) } // CHECK-NEXT: [[@LINE]]:8 -> [[@LINE+1]]:9 : (5 - 6)
() // Here to make sure this region is non empty ^
} }
f1(0) // CHECK-NEXT: [[@LINE-1]]:6 -> [[@LINE+1]]:4 : (((((1 + 3) + 5) - 2) - 4) - 6) f1(0) // CHECK-NEXT: [[@LINE-1]]:6 -> [[@LINE+1]]:4 : (((((1 + 3) + 5) - 2) - 4) - 6)
} }

View File

@@ -17,10 +17,9 @@ func f1() {}
// CHECK-NEXT: [[@LINE+1]]:1 -> [[@LINE+1]]:18 : 1 // CHECK-NEXT: [[@LINE+1]]:1 -> [[@LINE+1]]:18 : 1
var i : Int32 = 0 var i : Int32 = 0
// CHECK-NEXT: [[@LINE+4]]:1 -> [[@LINE+6]]:2 : 2 // CHECK-NEXT: [[@LINE+3]]:1 -> [[@LINE+5]]:2 : 2
// CHECK-NEXT: [[@LINE+3]]:7 -> [[@LINE+3]]:15 : (2 + 3) // CHECK-NEXT: [[@LINE+2]]:7 -> [[@LINE+2]]:15 : (2 + 3)
// CHECK-NEXT: [[@LINE+2]]:16 -> [[@LINE+4]]:2 : 3 // CHECK-NEXT: [[@LINE+1]]:16 -> [[@LINE+3]]:2 : 3
// CHECK-NEXT: [[@LINE+3]]:2 -> [[@LINE+3]]:2 : 2
while (i < 10) { while (i < 10) {
i += 1 i += 1
} }
@@ -30,10 +29,9 @@ while (i < 10) {
// CHECK-NEXT: [[@LINE+1]]:21 -> [[@LINE+1]]:22 : (4 - 5) // CHECK-NEXT: [[@LINE+1]]:21 -> [[@LINE+1]]:22 : (4 - 5)
var i2 = true ? 1 : 0; var i2 = true ? 1 : 0;
// CHECK-NEXT: [[@LINE+4]]:1 -> [[@LINE+6]]:2 : 6 // CHECK-NEXT: [[@LINE+3]]:1 -> [[@LINE+5]]:2 : 6
// CHECK-NEXT: [[@LINE+3]]:4 -> [[@LINE+3]]:10 : 6 // CHECK-NEXT: [[@LINE+2]]:4 -> [[@LINE+2]]:10 : 6
// CHECK-NEXT: [[@LINE+2]]:11 -> [[@LINE+4]]:2 : 7 // CHECK-NEXT: [[@LINE+1]]:11 -> [[@LINE+3]]:2 : 7
// CHECK-NEXT: [[@LINE+3]]:2 -> [[@LINE+3]]:2 : 6
if (true) { if (true) {
i2 = 2 i2 = 2
} }

View File

@@ -123,6 +123,10 @@ func goo() {
} while false // CHECK-DAG: [[@LINE]]:11 -> [[@LINE]]:16 : ([[RWS8]] - [[RET1]]) } while false // CHECK-DAG: [[@LINE]]:11 -> [[@LINE]]:16 : ([[RWS8]] - [[RET1]])
} }
eoo() // CHECK-LABEL: sil_coverage_map {{.*}}// coverage_while.hoo
foo() func hoo() { // CHECK-NEXT: [[@LINE]]:12 -> [[@LINE+5]]:2 : 0
goo() var i: Int = 0
while (i < 10) { // CHECK-NEXT: [[@LINE]]:9 -> [[@LINE]]:17 : (0 + 1)
i += 1 // CHECK-NEXT: [[@LINE-1]]:18 -> [[@LINE+1]]:4 : 1
} // CHECK-NEXT: [[@LINE]]:4 -> [[@LINE+1]]:2 : 0
}