File: copy_propagation_value.sil

package info (click to toggle)
swiftlang 6.1.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,791,532 kB
  • sloc: cpp: 9,901,743; ansic: 2,201,431; asm: 1,091,827; python: 308,252; objc: 82,166; f90: 80,126; lisp: 38,358; pascal: 25,559; sh: 20,429; ml: 5,058; perl: 4,745; makefile: 4,484; awk: 3,535; javascript: 3,018; xml: 918; fortran: 664; cs: 573; ruby: 396
file content (68 lines) | stat: -rw-r--r-- 2,442 bytes parent folder | download | duplicates (2)
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
}