File: copy_propagation_value.sil

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (68 lines) | stat: -rw-r--r-- 2,442 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// RUN: %target-sil-opt -copy-propagation -enable-sil-verify-all -module-name Swift %s | %FileCheck %s --check-prefixes=CHECK,CHECK-OPT
// RUN: %target-sil-opt -mandatory-copy-propagation -enable-sil-verify-all -module-name Swift %s | %FileCheck %s --check-prefixes=CHECK,CHECK-ONONE

// Runs CopyPropagation without borrow scope canonicalization.

sil_stage canonical

import Builtin

typealias AnyObject = Builtin.AnyObject

protocol Error {}

class B { }

class C {
  var a: Builtin.Int64
}

struct NonTrivialStruct {
  @_hasStorage var val: C { get set }
}

class CompileError : Error {}

// This test case used to have an invalid boundary extension.
// CHECK-LABEL: sil [ossa] @canonicalize_borrow_of_copy_with_interesting_boundary : $@convention(thin) (@owned C) -> (@owned NonTrivialStruct, @error any Error) {
// CHECK:       {{bb[0-9]+}}([[INSTANCE:%[^,]+]] :
// CHECK:         cond_br undef, [[SUCCESS:bb[0-9]+]], [[FAILURE:bb[0-9]+]]
// CHECK:       [[SUCCESS]]:
// CHECK:         [[BORROW:%[^,]+]] = begin_borrow [[INSTANCE]]
// CHECK:         [[STRUCT:%[^,]+]] = struct $NonTrivialStruct ([[BORROW]] : $C)
// CHECK:         [[STRUCT_OUT:%[^,]+]] = copy_value [[STRUCT]]
// CHECK:         end_borrow [[BORROW]]
// CHECK:         destroy_value [[INSTANCE]]
// CHECK:         return [[STRUCT_OUT]]
// CHECK:       [[FAILURE]]:
// CHECK:         destroy_value [[INSTANCE]]
// CHECK:         [[BOX:%[^,]+]] = alloc_existential_box
// CHECK:         throw [[BOX]]
// CHECK-LABEL: } // end sil function 'canonicalize_borrow_of_copy_with_interesting_boundary'
sil [ossa] @canonicalize_borrow_of_copy_with_interesting_boundary : $@convention(thin) (@owned C) -> (@owned NonTrivialStruct, @error any Error) {
bb0(%0 : @owned $C):
  %1 = copy_value %0 : $C
  %2 = copy_value %1 : $C
  cond_br undef, bb1, bb2
bb1:
  destroy_value %0 : $C
  destroy_value %1 : $C
  %6 = begin_borrow %2 : $C
  %7 = struct $NonTrivialStruct (%6 : $C)
  %8 = copy_value %7 : $NonTrivialStruct
  end_borrow %6 : $C
  destroy_value %2 : $C
  return %8 : $NonTrivialStruct
bb2:
  destroy_value %2 : $C
  %13 = begin_borrow %1 : $C
  %14 = struct $NonTrivialStruct (%13 : $C)
  %15 = copy_value %14 : $NonTrivialStruct
  end_borrow %13 : $C
  destroy_value %1 : $C
  destroy_value %15 : $NonTrivialStruct
  %19 = alloc_existential_box $any Error, $CompileError
  destroy_value %0 : $C
  %22 = builtin "willThrow"(%19 : $any Error) : $()
  throw %19 : $any Error
}