mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Just don't store the begin instruction.
This led to problem if the "begin" was not actually an instruction but a block argument.
Using the first instruction of that block is not correct in case the range ends immediately at the first instruction, e.g.
```
bb0(%0 : @owned $C):
destroy_value %0
```
132 lines
3.4 KiB
Plaintext
132 lines
3.4 KiB
Plaintext
// RUN: %target-sil-opt %s -dump-ranges -o /dev/null | %FileCheck %s
|
|
|
|
// REQUIRES: swift_in_compiler
|
|
|
|
sil_stage canonical
|
|
|
|
// CHECK-LABEL: Instruction range in basic_test:
|
|
// CHECK-NEXT: begin: %3 = string_literal utf8 "begin"
|
|
// CHECK-NEXT: ends: %7 = string_literal utf8 "end"
|
|
// CHECK-NEXT: %15 = string_literal utf8 "end"
|
|
// CHECK-NEXT: exits: %18 = string_literal utf8 "outside"
|
|
// CHECK-NEXT: interiors: %14 = string_literal utf8 "interior"
|
|
// CHECK-NEXT: %10 = string_literal utf8 "interior"
|
|
// CHECK-NEXT: Block range in basic_test:
|
|
// CHECK-NEXT: begin: bb1
|
|
// CHECK-NEXT: range: [bb1, bb3]
|
|
// CHECK-NEXT: inclrange: [bb2, bb1, bb4, bb3]
|
|
// CHECK-NEXT: ends: [bb2, bb4]
|
|
// CHECK-NEXT: exits: [bb5]
|
|
// CHECK-NEXT: interiors: [bb3]
|
|
// CHECK-NEXT: End function basic_test
|
|
sil @basic_test : $@convention(thin) () -> () {
|
|
bb0:
|
|
%0 = string_literal utf8 "outside"
|
|
br bb1
|
|
bb1:
|
|
%2 = string_literal utf8 "outside"
|
|
%3 = string_literal utf8 "begin"
|
|
%4 = string_literal utf8 "inside"
|
|
cond_br undef, bb2, bb3
|
|
bb2:
|
|
%6 = string_literal utf8 "inside"
|
|
%7 = string_literal utf8 "end"
|
|
%8 = string_literal utf8 "outside"
|
|
br bb6
|
|
bb3:
|
|
%10 = string_literal utf8 "interior"
|
|
%11 = string_literal utf8 "inside"
|
|
cond_br undef, bb4, bb5
|
|
bb4:
|
|
%13 = string_literal utf8 "inside"
|
|
%14 = string_literal utf8 "interior"
|
|
%15 = string_literal utf8 "end"
|
|
%16 = string_literal utf8 "outside"
|
|
br bb6
|
|
bb5:
|
|
%18 = string_literal utf8 "outside"
|
|
br bb6
|
|
bb6:
|
|
%r = tuple()
|
|
return %r : $()
|
|
}
|
|
|
|
// CHECK-LABEL: Instruction range in loops:
|
|
// CHECK-NEXT: begin: %3 = string_literal utf8 "begin"
|
|
// CHECK-NEXT: ends: %10 = string_literal utf8 "end"
|
|
// CHECK-NEXT: exits: %12 = tuple ()
|
|
// CHECK-NEXT: interiors:
|
|
// CHECK-NEXT: Block range in loops:
|
|
// CHECK-NEXT: begin: bb1
|
|
// CHECK-NEXT: range: [bb5, bb3, bb2, bb4, bb1]
|
|
// CHECK-NEXT: inclrange: [bb6, bb5, bb3, bb2, bb4, bb1]
|
|
// CHECK-NEXT: ends: [bb6]
|
|
// CHECK-NEXT: exits: [bb7]
|
|
// CHECK-NEXT: interiors: []
|
|
// CHECK-NEXT: End function loops
|
|
sil @loops : $@convention(thin) () -> () {
|
|
bb0:
|
|
%0 = string_literal utf8 "outside"
|
|
br bb1
|
|
bb1:
|
|
%2 = string_literal utf8 "outside"
|
|
%3 = string_literal utf8 "begin"
|
|
%4 = string_literal utf8 "inside"
|
|
br bb2
|
|
bb2:
|
|
cond_br undef, bb3, bb4
|
|
bb3:
|
|
cond_br undef, bb5, bb7
|
|
bb4:
|
|
br bb5
|
|
bb5:
|
|
cond_br undef, bb2, bb6
|
|
bb6:
|
|
%8 = string_literal utf8 "end"
|
|
cond_br undef, bb1, bb7
|
|
bb7:
|
|
%r = tuple()
|
|
return %r : $()
|
|
}
|
|
|
|
// CHECK-LABEL: Instruction range in minimal:
|
|
// CHECK-NEXT: begin: %0 = string_literal utf8 "begin"
|
|
// CHECK-NEXT: ends: %1 = string_literal utf8 "end"
|
|
// CHECK-NEXT: exits:
|
|
// CHECK-NEXT: interiors:
|
|
// CHECK-NEXT: Block range in minimal:
|
|
// CHECK-NEXT: begin: bb0
|
|
// CHECK-NEXT: range: []
|
|
// CHECK-NEXT: inclrange: [bb0]
|
|
// CHECK-NEXT: ends: [bb0]
|
|
// CHECK-NEXT: exits: []
|
|
// CHECK-NEXT: interiors: []
|
|
// CHECK-NEXT: End function minimal
|
|
sil @minimal : $@convention(thin) () -> () {
|
|
bb0:
|
|
%0 = string_literal utf8 "begin"
|
|
%1 = string_literal utf8 "end"
|
|
%r = tuple()
|
|
return %r : $()
|
|
}
|
|
|
|
// CHECK-LABEL: Instruction range in invalid:
|
|
// CHECK-NEXT: <invalid>
|
|
// CHECK: Block range in invalid:
|
|
// CHECK-NEXT: <invalid>
|
|
// CHECK: End function invalid
|
|
sil @invalid : $@convention(thin) () -> () {
|
|
bb0:
|
|
cond_br undef, bb1, bb2
|
|
bb1:
|
|
%1 = string_literal utf8 "begin"
|
|
br bb3
|
|
bb2:
|
|
br bb3
|
|
bb3:
|
|
%4 = string_literal utf8 "end"
|
|
%r = tuple()
|
|
return %r : $()
|
|
}
|
|
|