File: simplify_cfg_args_crash.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 (63 lines) | stat: -rw-r--r-- 1,730 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
// RUN: %target-sil-opt -enable-sil-verify-all %s -simplify-bb-args -sroa-bb-args | %FileCheck %s
sil_stage canonical

import Builtin
import Swift
import SwiftShims

enum E {
	case A
	case B
}

// Check that we don't crash in simplifyToSelectValue (rdar://problem/20037686)

// CHECK-LABEL: @test
sil public @test : $@convention(thin) (Builtin.Int64, @inout E) -> () {

bb0(%0 : $Builtin.Int64, %x : $*E):
  %1 = integer_literal $Builtin.Int64, 0
  %2 = builtin "cmp_eq_Int64"(%0 : $Builtin.Int64, %1 : $Builtin.Int64) : $Builtin.Int1 
  cond_br %2, bb3, bb1

bb1:
  %4 = enum $E, #E.A!enumelt
  br bb2(%4 : $E)

bb2(%6 : $E):
  store %6 to %x : $*E
  br bb3

bb3:                                            
  %8 = tuple ()                                
  return %8 : $()                              
}

// Verify that we do not crash in argument splitting (rdar://problem/25008398).

class C {
  @_hasStorage let x: Builtin.Int32
  init()
}

struct Pair {
  @_hasStorage let first: C
  @_hasStorage let second: C
}

// CHECK-LABEL: @simplify_args_crash
sil @simplify_args_crash : $@convention(thin) (Pair) -> () {
bb0(%1 : $Pair):
  // CHECK: [[SECOND:%.*]] = struct_extract %0 : $Pair, #Pair.second
  // CHECK: [[FIRST:%.*]] = struct_extract %0 : $Pair, #Pair.first
  // CHECK: br bb1([[FIRST]] : $C, [[SECOND]] : $C)
  br bb1(%1 : $Pair)

// CHECK: bb1([[FIRST2:%.*]] : $C, [[SECOND2:%.*]] : $C):
bb1(%2 : $Pair):
  // CHECK: [[STRUCT:%.*]] = struct $Pair ([[FIRST2]] : $C, [[SECOND2]] : $C)
  // CHECK: [[SECOND3:%.*]] = struct_extract [[STRUCT]] : $Pair, #Pair.second
  // CHECK: [[FIRST3:%.*]] = struct_extract [[STRUCT]] : $Pair, #Pair.first
  // CHECK: br bb1([[FIRST3]] : $C, [[SECOND3]] : $C)
  br bb1(%2 : $Pair)
}