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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
|
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
; RUN: opt -passes=ipsccp < %s -S | FileCheck %s
; RUN: opt -passes='ipsccp,ipsccp' < %s -S | FileCheck %s
define void @barney() {
; CHECK-LABEL: define {{[^@]+}}@barney() {
; CHECK-NEXT: bb:
; CHECK-NEXT: br label [[BB9:%.*]]
; CHECK: bb6:
; CHECK-NEXT: unreachable
; CHECK: bb9:
; CHECK-NEXT: br label [[BB6:%.*]]
;
bb:
br label %bb9
bb6: ; preds = %bb9
unreachable
bb7: ; preds = %bb9
unreachable
bb9: ; preds = %bb
switch i16 0, label %bb6 [
i16 61, label %bb7
]
}
define void @blam() {
; CHECK-LABEL: define {{[^@]+}}@blam() {
; CHECK-NEXT: bb:
; CHECK-NEXT: br label [[BB16:%.*]]
; CHECK: bb16:
; CHECK-NEXT: br label [[BB38:%.*]]
; CHECK: bb38:
; CHECK-NEXT: unreachable
;
bb:
br label %bb16
bb16: ; preds = %bb
switch i32 0, label %bb38 [
i32 66, label %bb17
i32 63, label %bb18
i32 86, label %bb19
]
bb17: ; preds = %bb16
unreachable
bb18: ; preds = %bb16
unreachable
bb19: ; preds = %bb16
unreachable
bb38: ; preds = %bb16
unreachable
}
define void @hoge() {
; CHECK-LABEL: define {{[^@]+}}@hoge() {
; CHECK-NEXT: bb:
; CHECK-NEXT: unreachable
;
bb:
switch i16 undef, label %bb1 [
i16 135, label %bb2
i16 66, label %bb2
]
bb1: ; preds = %bb
ret void
bb2: ; preds = %bb, %bb
switch i16 0, label %bb3 [
i16 61, label %bb4
i16 54, label %bb4
i16 49, label %bb4
]
bb3: ; preds = %bb2
unreachable
bb4: ; preds = %bb2, %bb2, %bb2
unreachable
}
; Test case from PR49573. %default.bb is unfeasible. Make sure it gets replaced
; by an unreachable block.
define void @pr49573_main() {
; CHECK-LABEL: define {{[^@]+}}@pr49573_main() {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[TGT:%.*]] = call i16 @pr49573_fn()
; CHECK-NEXT: unreachable
;
entry:
%tgt = call i16 @pr49573_fn()
switch i16 %tgt, label %default.bb [
i16 0, label %case.0
i16 1, label %case.1
i16 2, label %case.2
]
case.0:
unreachable
default.bb:
ret void
case.1:
ret void
case.2:
br label %next
next:
%tgt.2 = call i16 @pr49573_fn_2()
switch i16 %tgt.2, label %default.bb [
i16 0, label %case.0
i16 2, label %case.2
]
}
; Make sure a new unreachable BB is created.
define void @pr49573_main_2() {
; CHECK-LABEL: define {{[^@]+}}@pr49573_main_2() {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[TGT:%.*]] = call i16 @pr49573_fn()
; CHECK-NEXT: unreachable
;
entry:
%tgt = call i16 @pr49573_fn()
switch i16 %tgt, label %default.bb [
i16 0, label %case.0
i16 1, label %case.1
i16 2, label %case.2
]
case.0:
unreachable
default.bb:
ret void
case.1:
ret void
case.2:
ret void
}
define internal i16 @pr49573_fn() {
; CHECK-LABEL: define {{[^@]+}}@pr49573_fn() {
; CHECK-NEXT: entry:
; CHECK-NEXT: unreachable
;
entry:
br i1 undef, label %then, label %else
then:
ret i16 0
else:
ret i16 2
}
define internal i16 @pr49573_fn_2() {
; CHECK-LABEL: define {{[^@]+}}@pr49573_fn_2() {
; CHECK-NEXT: entry:
; CHECK-NEXT: unreachable
;
entry:
br i1 undef, label %then, label %else
then:
ret i16 0
else:
ret i16 2
}
|