Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 1 | ; RUN: opt < %s -callsite-splitting -S | FileCheck %s |
| 2 | ; RUN: opt < %s -passes='function(callsite-splitting)' -S | FileCheck %s |
| 3 | |
| 4 | target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" |
| 5 | target triple = "aarch64-linaro-linux-gnueabi" |
| 6 | |
| 7 | ;CHECK-LABEL: @test_eq_eq |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 8 | ;CHECK-LABEL: Tail.predBB.split: |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 9 | ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1) |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 10 | ;CHECK-LABEL: Tail.predBB.split1: |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 11 | ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2) |
| 12 | ;CHECK-LABEL: Tail |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 13 | ;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ] |
| 14 | ;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ] |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 15 | ;CHECK: ret i32 %[[MERGED]] |
| 16 | define i32 @test_eq_eq(i32* %a, i32 %v) { |
| 17 | Header: |
| 18 | %tobool1 = icmp eq i32* %a, null |
| 19 | br i1 %tobool1, label %Tail, label %TBB |
| 20 | |
| 21 | TBB: |
| 22 | %cmp = icmp eq i32 %v, 1 |
| 23 | br i1 %cmp, label %Tail, label %End |
| 24 | |
| 25 | Tail: |
| 26 | %p = phi i32[1,%Header], [2, %TBB] |
| 27 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 28 | ret i32 %r |
| 29 | |
| 30 | End: |
| 31 | ret i32 %v |
| 32 | } |
| 33 | |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 34 | ;CHECK-LABEL: @test_eq_eq_eq |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 35 | ;CHECK-LABEL: Tail.predBB.split: |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 36 | ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 10) |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 37 | ;CHECK-LABEL: Tail.predBB.split1: |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 38 | ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 %p) |
| 39 | ;CHECK-LABEL: Tail |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 40 | ;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ] |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 41 | ;CHECK: ret i32 %[[MERGED]] |
| 42 | define i32 @test_eq_eq_eq(i32* %a, i32 %v, i32 %p) { |
| 43 | Header: |
| 44 | %tobool1 = icmp eq i32* %a, null |
| 45 | br i1 %tobool1, label %Header2, label %End |
| 46 | |
| 47 | Header2: |
| 48 | %tobool2 = icmp eq i32 %p, 10 |
| 49 | br i1 %tobool2, label %Tail, label %TBB |
| 50 | |
| 51 | TBB: |
| 52 | %cmp = icmp eq i32 %v, 1 |
| 53 | br i1 %cmp, label %Tail, label %End |
| 54 | |
| 55 | Tail: |
| 56 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 57 | ret i32 %r |
| 58 | |
| 59 | End: |
| 60 | ret i32 %v |
| 61 | } |
| 62 | |
| 63 | ;CHECK-LABEL: @test_eq_eq_eq_constrain_same_i32_arg |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 64 | ;CHECK-LABEL: Tail.predBB.split: |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 65 | ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 222, i32 %p) |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 66 | ;CHECK-LABEL: Tail.predBB.split1: |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 67 | ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 333, i32 %p) |
| 68 | ;CHECK-LABEL: Tail |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 69 | ;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ] |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 70 | ;CHECK: ret i32 %[[MERGED]] |
| 71 | define i32 @test_eq_eq_eq_constrain_same_i32_arg(i32* %a, i32 %v, i32 %p) { |
| 72 | Header: |
| 73 | %tobool1 = icmp eq i32 %v, 111 |
| 74 | br i1 %tobool1, label %Header2, label %End |
| 75 | |
| 76 | Header2: |
| 77 | %tobool2 = icmp eq i32 %v, 222 |
| 78 | br i1 %tobool2, label %Tail, label %TBB |
| 79 | |
| 80 | TBB: |
| 81 | %cmp = icmp eq i32 %v, 333 |
| 82 | br i1 %cmp, label %Tail, label %End |
| 83 | |
| 84 | Tail: |
| 85 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 86 | ret i32 %r |
| 87 | |
| 88 | End: |
| 89 | ret i32 %v |
| 90 | } |
| 91 | |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 92 | ;CHECK-LABEL: @test_ne_eq |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 93 | ;CHECK-LABEL: Tail.predBB.split: |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 94 | ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1) |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 95 | ;CHECK-LABEL: Tail.predBB.split1: |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 96 | ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 2) |
| 97 | ;CHECK-LABEL: Tail |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 98 | ;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ] |
| 99 | ;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ] |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 100 | ;CHECK: ret i32 %[[MERGED]] |
| 101 | define i32 @test_ne_eq(i32* %a, i32 %v) { |
| 102 | Header: |
| 103 | %tobool1 = icmp ne i32* %a, null |
| 104 | br i1 %tobool1, label %Tail, label %TBB |
| 105 | |
| 106 | TBB: |
| 107 | %cmp = icmp eq i32 %v, 1 |
| 108 | br i1 %cmp, label %Tail, label %End |
| 109 | |
| 110 | Tail: |
| 111 | %p = phi i32[1,%Header], [2, %TBB] |
| 112 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 113 | ret i32 %r |
| 114 | |
| 115 | End: |
| 116 | ret i32 %v |
| 117 | } |
| 118 | |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 119 | ;CHECK-LABEL: @test_ne_eq_ne |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 120 | ;CHECK-LABEL: Tail.predBB.split: |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 121 | ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 10) |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 122 | ;CHECK-LABEL: Tail.predBB.split1: |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 123 | ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p) |
| 124 | ;CHECK-LABEL: Tail |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 125 | ;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ] |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 126 | ;CHECK: ret i32 %[[MERGED]] |
| 127 | define i32 @test_ne_eq_ne(i32* %a, i32 %v, i32 %p) { |
| 128 | Header: |
| 129 | %tobool1 = icmp ne i32* %a, null |
| 130 | br i1 %tobool1, label %Header2, label %End |
| 131 | |
| 132 | Header2: |
| 133 | %tobool2 = icmp eq i32 %p, 10 |
| 134 | br i1 %tobool2, label %Tail, label %TBB |
| 135 | |
| 136 | TBB: |
| 137 | %cmp = icmp ne i32 %v, 1 |
| 138 | br i1 %cmp, label %Tail, label %End |
| 139 | |
| 140 | Tail: |
| 141 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 142 | ret i32 %r |
| 143 | |
| 144 | End: |
| 145 | ret i32 %v |
| 146 | } |
| 147 | |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 148 | ;CHECK-LABEL: @test_ne_ne |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 149 | ;CHECK-LABEL: Tail.predBB.split: |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 150 | ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1) |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 151 | ;CHECK-LABEL: Tail.predBB.split1: |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 152 | ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 %v, i32 2) |
| 153 | ;CHECK-LABEL: Tail |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 154 | ;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ] |
| 155 | ;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ] |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 156 | ;CHECK: ret i32 %[[MERGED]] |
| 157 | define i32 @test_ne_ne(i32* %a, i32 %v) { |
| 158 | Header: |
| 159 | %tobool1 = icmp ne i32* %a, null |
| 160 | br i1 %tobool1, label %Tail, label %TBB |
| 161 | |
| 162 | TBB: |
| 163 | %cmp = icmp ne i32 %v, 1 |
| 164 | br i1 %cmp, label %Tail, label %End |
| 165 | |
| 166 | Tail: |
| 167 | %p = phi i32[1,%Header], [2, %TBB] |
| 168 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 169 | ret i32 %r |
| 170 | |
| 171 | End: |
| 172 | ret i32 %v |
| 173 | } |
| 174 | |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 175 | ;CHECK-LABEL: @test_ne_ne_ne_constrain_same_pointer_arg |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 176 | ;CHECK-LABEL: Tail.predBB.split: |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 177 | ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p) |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 178 | ;CHECK-LABEL: Tail.predBB.split1: |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 179 | ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p) |
| 180 | ;CHECK-LABEL: Tail |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 181 | ;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ] |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 182 | ;CHECK: ret i32 %[[MERGED]] |
| 183 | define i32 @test_ne_ne_ne_constrain_same_pointer_arg(i32* %a, i32 %v, i32 %p, i32* %a2, i32* %a3) { |
| 184 | Header: |
| 185 | %tobool1 = icmp ne i32* %a, null |
| 186 | br i1 %tobool1, label %Header2, label %End |
| 187 | |
| 188 | Header2: |
| 189 | %tobool2 = icmp ne i32* %a, %a2 |
| 190 | br i1 %tobool2, label %Tail, label %TBB |
| 191 | |
| 192 | TBB: |
| 193 | %cmp = icmp ne i32* %a, %a3 |
| 194 | br i1 %cmp, label %Tail, label %End |
| 195 | |
| 196 | Tail: |
| 197 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 198 | ret i32 %r |
| 199 | |
| 200 | End: |
| 201 | ret i32 %v |
| 202 | } |
| 203 | |
| 204 | |
| 205 | |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 206 | ;CHECK-LABEL: @test_eq_eq_untaken |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 207 | ;CHECK-LABEL: Tail.predBB.split: |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 208 | ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1) |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 209 | ;CHECK-LABEL: Tail.predBB.split1: |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 210 | ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 2) |
| 211 | ;CHECK-LABEL: Tail |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 212 | ;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ] |
| 213 | ;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ] |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 214 | ;CHECK: ret i32 %[[MERGED]] |
| 215 | define i32 @test_eq_eq_untaken(i32* %a, i32 %v) { |
| 216 | Header: |
| 217 | %tobool1 = icmp eq i32* %a, null |
| 218 | br i1 %tobool1, label %TBB, label %Tail |
| 219 | |
| 220 | TBB: |
| 221 | %cmp = icmp eq i32 %v, 1 |
| 222 | br i1 %cmp, label %Tail, label %End |
| 223 | |
| 224 | Tail: |
| 225 | %p = phi i32[1,%Header], [2, %TBB] |
| 226 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 227 | ret i32 %r |
| 228 | |
| 229 | End: |
| 230 | ret i32 %v |
| 231 | } |
| 232 | |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 233 | ;CHECK-LABEL: @test_eq_eq_eq_untaken |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 234 | ;CHECK-LABEL: Tail.predBB.split: |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 235 | ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 10) |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 236 | ;CHECK-LABEL: Tail.predBB.split1: |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 237 | ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 %p) |
| 238 | ;CHECK-LABEL: Tail |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 239 | ;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ] |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 240 | ;CHECK: ret i32 %[[MERGED]] |
| 241 | define i32 @test_eq_eq_eq_untaken(i32* %a, i32 %v, i32 %p) { |
| 242 | Header: |
| 243 | %tobool1 = icmp eq i32* %a, null |
| 244 | br i1 %tobool1, label %End, label %Header2 |
| 245 | |
| 246 | Header2: |
| 247 | %tobool2 = icmp eq i32 %p, 10 |
| 248 | br i1 %tobool2, label %Tail, label %TBB |
| 249 | |
| 250 | TBB: |
| 251 | %cmp = icmp eq i32 %v, 1 |
| 252 | br i1 %cmp, label %Tail, label %End |
| 253 | |
| 254 | Tail: |
| 255 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 256 | ret i32 %r |
| 257 | |
| 258 | End: |
| 259 | ret i32 %v |
| 260 | } |
| 261 | |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 262 | ;CHECK-LABEL: @test_ne_eq_untaken |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 263 | ;CHECK-LABEL: Tail.predBB.split: |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 264 | ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1) |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 265 | ;CHECK-LABEL: Tail.predBB.split1: |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 266 | ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2) |
| 267 | ;CHECK-LABEL: Tail |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 268 | ;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ] |
| 269 | ;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ] |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 270 | ;CHECK: ret i32 %[[MERGED]] |
| 271 | define i32 @test_ne_eq_untaken(i32* %a, i32 %v) { |
| 272 | Header: |
| 273 | %tobool1 = icmp ne i32* %a, null |
| 274 | br i1 %tobool1, label %TBB, label %Tail |
| 275 | |
| 276 | TBB: |
| 277 | %cmp = icmp eq i32 %v, 1 |
| 278 | br i1 %cmp, label %Tail, label %End |
| 279 | |
| 280 | Tail: |
| 281 | %p = phi i32[1,%Header], [2, %TBB] |
| 282 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 283 | ret i32 %r |
| 284 | |
| 285 | End: |
| 286 | ret i32 %v |
| 287 | } |
| 288 | |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 289 | ;CHECK-LABEL: @test_ne_eq_ne_untaken |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 290 | ;CHECK-LABEL: Tail.predBB.split: |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 291 | ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 10) |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 292 | ;CHECK-LABEL: Tail.predBB.split1: |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 293 | ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 %v, i32 %p) |
| 294 | ;CHECK-LABEL: Tail |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 295 | ;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ] |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 296 | ;CHECK: ret i32 %[[MERGED]] |
| 297 | define i32 @test_ne_eq_ne_untaken(i32* %a, i32 %v, i32 %p) { |
| 298 | Header: |
| 299 | %tobool1 = icmp ne i32* %a, null |
| 300 | br i1 %tobool1, label %End, label %Header2 |
| 301 | |
| 302 | Header2: |
| 303 | %tobool2 = icmp eq i32 %p, 10 |
| 304 | br i1 %tobool2, label %Tail, label %TBB |
| 305 | |
| 306 | TBB: |
| 307 | %cmp = icmp ne i32 %v, 1 |
| 308 | br i1 %cmp, label %Tail, label %End |
| 309 | |
| 310 | Tail: |
| 311 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 312 | ret i32 %r |
| 313 | |
| 314 | End: |
| 315 | ret i32 %v |
| 316 | } |
| 317 | |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 318 | ;CHECK-LABEL: @test_ne_ne_untaken |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 319 | ;CHECK-LABEL: Tail.predBB.split: |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 320 | ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1) |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 321 | ;CHECK-LABEL: Tail.predBB.split1: |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 322 | ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2) |
| 323 | ;CHECK-LABEL: Tail |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 324 | ;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ] |
| 325 | ;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ] |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 326 | ;CHECK: ret i32 %[[MERGED]] |
| 327 | define i32 @test_ne_ne_untaken(i32* %a, i32 %v) { |
| 328 | Header: |
| 329 | %tobool1 = icmp ne i32* %a, null |
| 330 | br i1 %tobool1, label %TBB, label %Tail |
| 331 | |
| 332 | TBB: |
| 333 | %cmp = icmp ne i32 %v, 1 |
| 334 | br i1 %cmp, label %End, label %Tail |
| 335 | |
| 336 | Tail: |
| 337 | %p = phi i32[1,%Header], [2, %TBB] |
| 338 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 339 | ret i32 %r |
| 340 | |
| 341 | End: |
| 342 | ret i32 %v |
| 343 | } |
| 344 | |
| 345 | ;CHECK-LABEL: @test_nonconst_const_phi |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 346 | ;CHECK-LABEL: Tail.predBB.split: |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 347 | ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1) |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 348 | ;CHECK-LABEL: Tail.predBB.split1: |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 349 | ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 2) |
| 350 | ;CHECK-LABEL: Tail |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 351 | ;CHECK: %p = phi i32 [ 1, %Tail.predBB.split ], [ 2, %Tail.predBB.split1 ] |
| 352 | ;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ] |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 353 | ;CHECK: ret i32 %[[MERGED]] |
| 354 | define i32 @test_nonconst_const_phi(i32* %a, i32* %b, i32 %v) { |
| 355 | Header: |
| 356 | %tobool1 = icmp eq i32* %a, %b |
| 357 | br i1 %tobool1, label %Tail, label %TBB |
| 358 | |
| 359 | TBB: |
| 360 | %cmp = icmp eq i32 %v, 1 |
| 361 | br i1 %cmp, label %Tail, label %End |
| 362 | |
| 363 | Tail: |
| 364 | %p = phi i32[1,%Header], [2, %TBB] |
| 365 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 366 | ret i32 %r |
| 367 | |
| 368 | End: |
| 369 | ret i32 %v |
| 370 | } |
| 371 | |
| 372 | ;CHECK-LABEL: @test_nonconst_nonconst_phi |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 373 | ;CHECK-LABEL: Tail.predBB.split: |
Florian Hahn | 2a266a3 | 2017-11-18 18:14:13 +0000 | [diff] [blame] | 374 | ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 2) |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 375 | ;CHECK-LABEL: Tail.predBB.split1: |
Florian Hahn | 2a266a3 | 2017-11-18 18:14:13 +0000 | [diff] [blame] | 376 | ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1) |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 377 | ;CHECK-LABEL: Tail |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 378 | ;CHECK: %p = phi i32 [ 2, %Tail.predBB.split ], [ 1, %Tail.predBB.split1 ] |
| 379 | ;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ] |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 380 | ;CHECK: ret i32 %[[MERGED]] |
| 381 | define i32 @test_nonconst_nonconst_phi(i32* %a, i32* %b, i32 %v, i32 %v2) { |
| 382 | Header: |
| 383 | %tobool1 = icmp eq i32* %a, %b |
| 384 | br i1 %tobool1, label %Tail, label %TBB |
| 385 | |
| 386 | TBB: |
| 387 | %cmp = icmp eq i32 %v, %v2 |
| 388 | br i1 %cmp, label %Tail, label %End |
| 389 | |
| 390 | Tail: |
| 391 | %p = phi i32[1,%Header], [2, %TBB] |
| 392 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 393 | ret i32 %r |
| 394 | |
| 395 | End: |
| 396 | ret i32 %v |
| 397 | } |
| 398 | |
Florian Hahn | 2a266a3 | 2017-11-18 18:14:13 +0000 | [diff] [blame] | 399 | ;CHECK-LABEL: @test_cfg_no_or_phi |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 400 | ;CHECK-LABEL: Tail.predBB.split |
Florian Hahn | 2a266a3 | 2017-11-18 18:14:13 +0000 | [diff] [blame] | 401 | ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 2) |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 402 | ;CHECK-LABEL: Tail.predBB.split1: |
Florian Hahn | 2a266a3 | 2017-11-18 18:14:13 +0000 | [diff] [blame] | 403 | ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1) |
| 404 | ;CHECK-LABEL: Tail |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 405 | ;CHECK: %p = phi i32 [ 2, %Tail.predBB.split ], [ 1, %Tail.predBB.split1 ] |
| 406 | ;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ] |
Florian Hahn | 2a266a3 | 2017-11-18 18:14:13 +0000 | [diff] [blame] | 407 | ;CHECK: ret i32 %[[MERGED]] |
| 408 | define i32 @test_cfg_no_or_phi(i32* %a, i32 %v) { |
| 409 | entry: |
| 410 | br i1 undef, label %TBB0, label %TBB1 |
| 411 | TBB0: |
| 412 | br i1 undef, label %Tail, label %End |
| 413 | TBB1: |
| 414 | br i1 undef, label %Tail, label %End |
| 415 | Tail: |
| 416 | %p = phi i32[1,%TBB0], [2, %TBB1] |
| 417 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 418 | ret i32 %r |
| 419 | End: |
| 420 | ret i32 %v |
| 421 | } |
| 422 | |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 423 | ;CHECK-LABEL: @test_nonconst_nonconst_phi_noncost |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 424 | ;CHECK-NOT: Tail.predBB.split: |
| 425 | ;CHECK-NOT: Tail.predBB.split1: |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 426 | ;CHECK-LABEL: Tail: |
| 427 | ;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 428 | ;CHECK: ret i32 %r |
| 429 | define i32 @test_nonconst_nonconst_phi_noncost(i32* %a, i32* %b, i32 %v, i32 %v2) { |
| 430 | Header: |
| 431 | %tobool1 = icmp eq i32* %a, %b |
| 432 | br i1 %tobool1, label %Tail, label %TBB |
| 433 | |
| 434 | TBB: |
| 435 | %cmp = icmp eq i32 %v, %v2 |
| 436 | br i1 %cmp, label %Tail, label %End |
| 437 | |
| 438 | Tail: |
| 439 | %p = phi i32[%v,%Header], [%v2, %TBB] |
| 440 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 441 | ret i32 %r |
| 442 | |
| 443 | End: |
| 444 | ret i32 %v |
| 445 | } |
| 446 | |
| 447 | ;CHECK-LABEL: @test_fisrtnonphi |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 448 | ;CHECK-NOT: Tail.predBB.split: |
| 449 | ;CHECK-NOT: Tail.predBB.split1: |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 450 | ;CHECK-LABEL: Tail: |
| 451 | ;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 452 | ;CHECK: ret i32 %r |
| 453 | define i32 @test_fisrtnonphi(i32* %a, i32 %v) { |
| 454 | Header: |
| 455 | %tobool1 = icmp eq i32* %a, null |
| 456 | br i1 %tobool1, label %Tail, label %TBB |
| 457 | |
| 458 | TBB: |
| 459 | %cmp = icmp eq i32 %v, 1 |
| 460 | br i1 %cmp, label %Tail, label %End |
| 461 | |
| 462 | Tail: |
| 463 | %p = phi i32[1,%Header], [2, %TBB] |
| 464 | store i32 %v, i32* %a |
| 465 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 466 | ret i32 %r |
| 467 | |
| 468 | End: |
| 469 | ret i32 %v |
| 470 | } |
| 471 | |
| 472 | ;CHECK-LABEL: @test_3preds_constphi |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 473 | ;CHECK-NOT: Tail.predBB.split: |
| 474 | ;CHECK-NOT: Tail.predBB.split1: |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 475 | ;CHECK-LABEL: Tail: |
| 476 | ;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 477 | ;CHECK: ret i32 %r |
| 478 | define i32 @test_3preds_constphi(i32* %a, i32 %v, i1 %c1, i1 %c2, i1 %c3) { |
| 479 | Header: |
| 480 | br i1 %c1, label %Tail, label %TBB1 |
| 481 | |
| 482 | TBB1: |
| 483 | br i1 %c2, label %Tail, label %TBB2 |
| 484 | |
| 485 | TBB2: |
| 486 | br i1 %c3, label %Tail, label %End |
| 487 | |
| 488 | Tail: |
| 489 | %p = phi i32[1,%Header], [2, %TBB1], [3, %TBB2] |
| 490 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 491 | ret i32 %r |
| 492 | |
| 493 | End: |
| 494 | ret i32 %v |
| 495 | } |
| 496 | |
| 497 | ;CHECK-LABEL: @test_indirectbr_phi |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 498 | ;CHECK-NOT: Tail.predBB.split: |
| 499 | ;CHECK-NOT: Tail.predBB.split1: |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 500 | ;CHECK-LABEL: Tail: |
| 501 | ;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 502 | ;CHECK: ret i32 %r |
| 503 | define i32 @test_indirectbr_phi(i8* %address, i32* %a, i32* %b, i32 %v) { |
| 504 | Header: |
| 505 | %indirect.goto.dest = select i1 undef, i8* blockaddress(@test_indirectbr_phi, %End), i8* %address |
| 506 | indirectbr i8* %indirect.goto.dest, [label %TBB, label %Tail] |
| 507 | |
| 508 | TBB: |
| 509 | %indirect.goto.dest2 = select i1 undef, i8* blockaddress(@test_indirectbr_phi, %End), i8* %address |
| 510 | indirectbr i8* %indirect.goto.dest2, [label %Tail, label %End] |
| 511 | |
| 512 | Tail: |
| 513 | %p = phi i32[1,%Header], [2, %TBB] |
| 514 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 515 | ret i32 %r |
| 516 | |
| 517 | End: |
| 518 | ret i32 %v |
| 519 | } |
| 520 | |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 521 | ;CHECK-LABEL: @test_unreachable |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 522 | ;CHECK-LABEL: Tail.predBB.split: |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 523 | ;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 10) |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 524 | ;CHECK-LABEL: Tail.predBB.split1: |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 525 | ;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 %p) |
| 526 | ;CHECK-LABEL: Tail |
Florian Hahn | c6c89bf | 2018-01-16 22:13:15 +0000 | [diff] [blame] | 527 | ;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Tail.predBB.split ], [ %[[CALL2]], %Tail.predBB.split1 ] |
Florian Hahn | beda7d5 | 2017-12-13 03:05:20 +0000 | [diff] [blame] | 528 | ;CHECK: ret i32 %[[MERGED]] |
| 529 | define i32 @test_unreachable(i32* %a, i32 %v, i32 %p) { |
| 530 | Entry: |
| 531 | br label %End |
| 532 | Header: |
| 533 | %tobool2 = icmp eq i32 %p, 10 |
| 534 | br i1 %tobool2, label %Tail, label %TBB |
| 535 | TBB: |
| 536 | %cmp = icmp eq i32 %v, 1 |
| 537 | br i1 %cmp, label %Tail, label %Header |
| 538 | Tail: |
| 539 | %r = call i32 @callee(i32* %a, i32 %v, i32 %p) |
| 540 | ret i32 %r |
| 541 | End: |
| 542 | ret i32 %v |
| 543 | } |
| 544 | |
Jun Bum Lim | 0c99007 | 2017-11-03 20:41:16 +0000 | [diff] [blame] | 545 | define i32 @callee(i32* %a, i32 %v, i32 %p) { |
| 546 | entry: |
| 547 | %c = icmp ne i32* %a, null |
| 548 | br i1 %c, label %BB1, label %BB2 |
| 549 | |
| 550 | BB1: |
| 551 | call void @dummy(i32* %a, i32 %p) |
| 552 | br label %End |
| 553 | |
| 554 | BB2: |
| 555 | call void @dummy2(i32 %v, i32 %p) |
| 556 | br label %End |
| 557 | |
| 558 | End: |
| 559 | ret i32 %p |
| 560 | } |
| 561 | |
| 562 | declare void @dummy(i32*, i32) |
| 563 | declare void @dummy2(i32, i32) |