Don't emit shadow copies for anonymous variables.

Switch statements generate at least one anonymous match variable per
case, which consumes both a lot of stack space and an explosion of
range extension depencies due to the way case statements are scoped.

rdar://problem/34326355
This commit is contained in:
Adrian Prantl
2017-11-16 10:41:40 -08:00
parent 5015ee1107
commit e574aa765f
4 changed files with 55 additions and 58 deletions

View File

@@ -31,27 +31,28 @@ public func mangle(s: [UnicodeScalar]) -> [UnicodeScalar] {
// The patterns in the first case statement each define an anonymous variable,
// which shares the storage with the expression in the switch statement. Make
// sure we only emit live range extensions for the storage once per basic block.
// sure we emit a dbg.value once per basic block.
// CHECK: define {{.*}}@_T011patternvars6mangleSayAA13UnicodeScalarVGAE1s_tFA2DcfU_
// CHECK: call void asm sideeffect "", "r"
// CHECK-NOT: call void asm sideeffect "", "r"
// CHECK: br {{.*}}label
// CHECK: call void asm sideeffect "", "r"
// CHECK-NOT: call void asm sideeffect "", "r"
// CHECK: br {{.*}}label
// CHECK: call void asm sideeffect "", "r"
// CHECK-NOT: call void asm sideeffect "", "r"
// CHECK: br {{.*}}label
// CHECK: call void asm sideeffect "", "r"
// CHECK-NOT: call void asm sideeffect "", "r"
// CHECK: br {{.*}}label
// CHECK: call void asm sideeffect "", "r"
// CHECK-NOT: call void asm sideeffect "", "r"
// CHECK: br {{.*}}label
// CHECK: call void asm sideeffect "", "r"
// CHECK-NOT: call void asm sideeffect "", "r"
// CHECK: br {{.*}}label
// CHECK: call void asm sideeffect "", "r"
// CHECK-NOT: call void asm sideeffect "", "r"
// CHECK: br {{.*}}label
// CHECK: %[[VAL:[0-9]+]] = call swiftcc i32 @_T011patternvars13UnicodeScalarV5values6UInt32Vvg(i32 %0)
// CHECK-NEXT: call void @llvm.dbg.value(metadata i32 %[[VAL]]
// CHECK: ; <label>
// CHECK: call void @llvm.dbg.value(metadata i32 %[[VAL]]
// CHECK-NOT: call void @llvm.dbg.value
// CHECK-NOT: call void asm sideeffect "", "r"
// CHECK: ; <label>
// CHECK: call void @llvm.dbg.value(metadata i32 %[[VAL]]
// CHECK-NOT: call void @llvm.dbg.value
// CHECK-NOT: call void asm sideeffect "", "r"
// CHECK: ; <label>
// CHECK: call void @llvm.dbg.value(metadata i32 %[[VAL]]
// CHECK-NOT: call void @llvm.dbg.value
// CHECK-NOT: call void asm sideeffect "", "r"
// CHECK: ; <label>
// CHECK: call void @llvm.dbg.value(metadata i32 %[[VAL]]
// CHECK-NOT: call void @llvm.dbg.value
// CHECK-NOT: call void asm sideeffect "", "r"