Files
swift-mirror/test/SILOptimizer/ranges.sil
Erik Eckstein 4b462004e7 Optimizer: Fix InstructionRange's begin instruction
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
```
2024-12-10 16:28:10 +01:00

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 : $()
}