File: control-flow.ll

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 (109 lines) | stat: -rw-r--r-- 2,764 bytes parent folder | download | duplicates (12)
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
; RUN: mlir-translate -import-llvm -split-input-file %s | FileCheck %s

; Verify the import works if the blocks are not topologically sorted.
; CHECK-LABEL: @dominance_order
; CHECK-SAME:  %[[ARG1:[a-zA-Z0-9]+]]
define i64 @dominance_order(i64 %arg1) {
  ; CHECK: llvm.br ^[[BB2:.+]]
  br label %bb2
bb1:
  ; CHECK: ^[[BB1:[a-zA-Z0-9]+]]:
  ; CHECK:  llvm.return %[[VAL1:.+]] : i64
  ret i64 %1
bb2:
  ; CHECK: ^[[BB2]]:
  ; CHECK: %[[VAL1]] = llvm.add %[[ARG1]]
  %1 = add i64 %arg1, 3
  ; CHECK: llvm.br ^[[BB1]]
  br label %bb1
}

; // -----

; CHECK-LABEL: @block_argument
; CHECK-SAME:  %[[ARG1:[a-zA-Z0-9]+]]
; CHECK-SAME:  %[[ARG2:[a-zA-Z0-9]+]]
define i64 @block_argument(i1 %arg1, i64 %arg2) {
entry:
  ; CHECK: llvm.cond_br %[[ARG1]]
  ; CHECK-SAME: ^[[BB1:.+]](%[[ARG2]] : i64)
  ; CHECK-SAME: ^[[BB2:.+]]
  br i1 %arg1, label %bb1, label %bb2
bb1:
  ; CHECK: ^[[BB1]](%[[BA1:.+]]: i64):
  ; CHECK: llvm.return %[[BA1]] : i64
  %0 = phi i64 [ %arg2, %entry ], [ %1, %bb2 ]
  ret i64 %0
bb2:
  ; CHECK: ^[[BB2]]:
  ; CHECK: %[[VAL1:.+]] = llvm.add %[[ARG2]]
  ; CHECK: llvm.br ^[[BB1]](%[[VAL1]]
  %1 = add i64 %arg2, 3
  br label %bb1
}

; // -----

; CHECK-LABEL: @simple_switch(
; CHECK-SAME:  %[[ARG1:[a-zA-Z0-9]+]]
define i64 @simple_switch(i64 %arg1) {
  ; CHECK: %[[VAL1:.+]] = llvm.add
  ; CHECK: %[[VAL2:.+]] = llvm.sub
  ; CHECK: %[[VAL3:.+]] = llvm.mul
  %1 = add i64 %arg1, 42
  %2 = sub i64 %arg1, 42
  %3 = mul i64 %arg1, 42
  ; CHECK: llvm.switch %[[ARG1]] : i64, ^[[BBD:.+]] [
  ; CHECK:   0: ^[[BB1:.+]],
  ; CHECK:   9: ^[[BB2:.+]]
  ; CHECK: ]
  switch i64 %arg1, label %bbd [
    i64 0, label %bb1
    i64 9, label %bb2
  ]
bb1:
  ; CHECK: ^[[BB1]]:
  ; CHECK: llvm.return %[[VAL1]]
  ret i64 %1
bb2:
  ; CHECK: ^[[BB2]]:
  ; CHECK: llvm.return %[[VAL2]]
  ret i64 %2
bbd:
  ; CHECK: ^[[BBD]]:
  ; CHECK: llvm.return %[[VAL3]]
  ret i64 %3
}

; // -----

; CHECK-LABEL: @switch_args
; CHECK-SAME:  %[[ARG1:[a-zA-Z0-9]+]]
define i32 @switch_args(i32 %arg1) {
entry:
  ; CHECK: %[[VAL1:.+]] = llvm.add
  ; CHECK: %[[VAL2:.+]] = llvm.sub
  ; CHECK: %[[VAL3:.+]] = llvm.mul
  %0 = add i32 %arg1, 42
  %1 = sub i32 %arg1, 42
  %2 = mul i32 %arg1, 42
  ; CHECK: llvm.switch %[[ARG1]] : i32, ^[[BBD:.+]](%[[VAL3]] : i32) [
  ; CHECK:   0: ^[[BB1:.+]](%[[VAL1]], %[[VAL2]] : i32, i32)
  ; CHECK: ]
  switch i32 %arg1, label %bbd [
    i32 0, label %bb1
  ]
bb1:
  ; CHECK: ^[[BB1]](%[[BA1:.+]]: i32, %[[BA2:.+]]: i32):
  ; CHECK: %[[VAL1:.*]] = llvm.add %[[BA1]], %[[BA2]] : i32
  %3 = phi i32 [%0, %entry]
  %4 = phi i32 [%1, %entry]
  %5 = add i32 %3, %4
  ; CHECK: llvm.br ^[[BBD]](%[[VAL1]]
  br label %bbd
bbd:
  ; CHECK: ^[[BBD]](%[[BA3:.+]]: i32):
  ; CHECK: llvm.return %[[BA3]]
  %6 = phi i32 [%2, %entry], [%5, %bb1]
  ret i32 %6
}