1 ; RUN: opt -S -bdce -instsimplify < %s | FileCheck %s 2 ; RUN: opt -S -instsimplify < %s | FileCheck %s -check-prefix=CHECK-IO 3 ; RUN: opt -S -debugify -bdce < %s | FileCheck %s -check-prefix=DEBUGIFY 4 target datalayout = "E-m:e-i64:64-n32:64" 5 target triple = "powerpc64-unknown-linux-gnu" 6 7 ; Function Attrs: nounwind readnone 8 define signext i32 @bar(i32 signext %x) #0 { 9 entry: 10 %call = tail call signext i32 @foo(i32 signext 5) #0 11 %and = and i32 %call, 4 12 %or = or i32 %and, %x 13 %call1 = tail call signext i32 @foo(i32 signext 3) #0 14 %and2 = and i32 %call1, 8 15 %or3 = or i32 %or, %and2 16 %call4 = tail call signext i32 @foo(i32 signext 2) #0 17 %and5 = and i32 %call4, 16 18 %or6 = or i32 %or3, %and5 19 %call7 = tail call signext i32 @foo(i32 signext 1) #0 20 %and8 = and i32 %call7, 32 21 %or9 = or i32 %or6, %and8 22 %call10 = tail call signext i32 @foo(i32 signext 0) #0 23 %and11 = and i32 %call10, 64 24 %or12 = or i32 %or9, %and11 25 %call13 = tail call signext i32 @foo(i32 signext 4) #0 26 %and14 = and i32 %call13, 128 27 %or15 = or i32 %or12, %and14 28 %shr = ashr i32 %or15, 4 29 ret i32 %shr 30 31 ; CHECK-LABEL: @bar 32 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) 33 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) 34 ; CHECK: tail call signext i32 @foo(i32 signext 2) 35 ; CHECK: tail call signext i32 @foo(i32 signext 1) 36 ; CHECK: tail call signext i32 @foo(i32 signext 0) 37 ; CHECK: tail call signext i32 @foo(i32 signext 4) 38 ; CHECK: ret i32 39 40 ; Check that instsimplify is not doing this all on its own. 41 ; CHECK-IO-LABEL: @bar 42 ; CHECK-IO: tail call signext i32 @foo(i32 signext 5) 43 ; CHECK-IO: tail call signext i32 @foo(i32 signext 3) 44 ; CHECK-IO: tail call signext i32 @foo(i32 signext 2) 45 ; CHECK-IO: tail call signext i32 @foo(i32 signext 1) 46 ; CHECK-IO: tail call signext i32 @foo(i32 signext 0) 47 ; CHECK-IO: tail call signext i32 @foo(i32 signext 4) 48 ; CHECK-IO: ret i32 49 } 50 51 ; Function Attrs: nounwind readnone 52 declare signext i32 @foo(i32 signext) #0 53 54 ; Function Attrs: nounwind readnone 55 define signext i32 @far(i32 signext %x) #1 { 56 entry: 57 %call = tail call signext i32 @goo(i32 signext 5) #1 58 %and = and i32 %call, 4 59 %or = or i32 %and, %x 60 %call1 = tail call signext i32 @goo(i32 signext 3) #1 61 %and2 = and i32 %call1, 8 62 %or3 = or i32 %or, %and2 63 %call4 = tail call signext i32 @goo(i32 signext 2) #1 64 %and5 = and i32 %call4, 16 65 %or6 = or i32 %or3, %and5 66 %call7 = tail call signext i32 @goo(i32 signext 1) #1 67 %and8 = and i32 %call7, 32 68 %or9 = or i32 %or6, %and8 69 %call10 = tail call signext i32 @goo(i32 signext 0) #1 70 %and11 = and i32 %call10, 64 71 %or12 = or i32 %or9, %and11 72 %call13 = tail call signext i32 @goo(i32 signext 4) #1 73 %and14 = and i32 %call13, 128 74 %or15 = or i32 %or12, %and14 75 %shr = ashr i32 %or15, 4 76 ret i32 %shr 77 78 ; CHECK-LABEL: @far 79 ; Calls to foo(5) and foo(3) are still there, but their results are not used. 80 ; CHECK: tail call signext i32 @goo(i32 signext 5) 81 ; CHECK-NEXT: tail call signext i32 @goo(i32 signext 3) 82 ; CHECK-NEXT: tail call signext i32 @goo(i32 signext 2) 83 ; CHECK: tail call signext i32 @goo(i32 signext 1) 84 ; CHECK: tail call signext i32 @goo(i32 signext 0) 85 ; CHECK: tail call signext i32 @goo(i32 signext 4) 86 ; CHECK: ret i32 87 88 ; Check that instsimplify is not doing this all on its own. 89 ; CHECK-IO-LABEL: @far 90 ; CHECK-IO: tail call signext i32 @goo(i32 signext 5) 91 ; CHECK-IO: tail call signext i32 @goo(i32 signext 3) 92 ; CHECK-IO: tail call signext i32 @goo(i32 signext 2) 93 ; CHECK-IO: tail call signext i32 @goo(i32 signext 1) 94 ; CHECK-IO: tail call signext i32 @goo(i32 signext 0) 95 ; CHECK-IO: tail call signext i32 @goo(i32 signext 4) 96 ; CHECK-IO: ret i32 97 } 98 99 declare signext i32 @goo(i32 signext) #1 100 101 ; Function Attrs: nounwind readnone 102 define signext i32 @tar1(i32 signext %x) #0 { 103 entry: 104 %call = tail call signext i32 @foo(i32 signext 5) #0 105 %and = and i32 %call, 33554432 106 %or = or i32 %and, %x 107 %call1 = tail call signext i32 @foo(i32 signext 3) #0 108 %and2 = and i32 %call1, 67108864 109 %or3 = or i32 %or, %and2 110 %call4 = tail call signext i32 @foo(i32 signext 2) #0 111 %and5 = and i32 %call4, 16 112 %or6 = or i32 %or3, %and5 113 %call7 = tail call signext i32 @foo(i32 signext 1) #0 114 %and8 = and i32 %call7, 32 115 %or9 = or i32 %or6, %and8 116 %call10 = tail call signext i32 @foo(i32 signext 0) #0 117 %and11 = and i32 %call10, 64 118 %or12 = or i32 %or9, %and11 119 %call13 = tail call signext i32 @foo(i32 signext 4) #0 120 %and14 = and i32 %call13, 128 121 %or15 = or i32 %or12, %and14 122 %bs = tail call i32 @llvm.bswap.i32(i32 %or15) #0 123 %shr = ashr i32 %bs, 4 124 ret i32 %shr 125 126 ; CHECK-LABEL: @tar1 127 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) 128 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) 129 ; CHECK: tail call signext i32 @foo(i32 signext 2) 130 ; CHECK: tail call signext i32 @foo(i32 signext 1) 131 ; CHECK: tail call signext i32 @foo(i32 signext 0) 132 ; CHECK: tail call signext i32 @foo(i32 signext 4) 133 ; CHECK: ret i32 134 } 135 136 ; Function Attrs: nounwind readnone 137 declare i32 @llvm.bswap.i32(i32) #0 138 139 ; Function Attrs: nounwind readnone 140 define signext i32 @tim(i32 signext %x) #0 { 141 entry: 142 %call = tail call signext i32 @foo(i32 signext 5) #0 143 %and = and i32 %call, 536870912 144 %or = or i32 %and, %x 145 %call1 = tail call signext i32 @foo(i32 signext 3) #0 146 %and2 = and i32 %call1, 1073741824 147 %or3 = or i32 %or, %and2 148 %call4 = tail call signext i32 @foo(i32 signext 2) #0 149 %and5 = and i32 %call4, 16 150 %or6 = or i32 %or3, %and5 151 %call7 = tail call signext i32 @foo(i32 signext 1) #0 152 %and8 = and i32 %call7, 32 153 %or9 = or i32 %or6, %and8 154 %call10 = tail call signext i32 @foo(i32 signext 0) #0 155 %and11 = and i32 %call10, 64 156 %or12 = or i32 %or9, %and11 157 %call13 = tail call signext i32 @foo(i32 signext 4) #0 158 %and14 = and i32 %call13, 128 159 %or15 = or i32 %or12, %and14 160 %bs = tail call i32 @llvm.bitreverse.i32(i32 %or15) #0 161 %shr = ashr i32 %bs, 4 162 ret i32 %shr 163 164 ; CHECK-LABEL: @tim 165 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) 166 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) 167 ; CHECK: tail call signext i32 @foo(i32 signext 2) 168 ; CHECK: tail call signext i32 @foo(i32 signext 1) 169 ; CHECK: tail call signext i32 @foo(i32 signext 0) 170 ; CHECK: tail call signext i32 @foo(i32 signext 4) 171 ; CHECK: ret i32 172 } 173 174 ; Function Attrs: nounwind readnone 175 declare i32 @llvm.bitreverse.i32(i32) #0 176 177 ; Function Attrs: nounwind readnone 178 define signext i32 @tar2(i32 signext %x) #0 { 179 entry: 180 %call = tail call signext i32 @foo(i32 signext 5) #0 181 %and = and i32 %call, 33554432 182 %or = or i32 %and, %x 183 %call1 = tail call signext i32 @foo(i32 signext 3) #0 184 %and2 = and i32 %call1, 67108864 185 %or3 = or i32 %or, %and2 186 %call4 = tail call signext i32 @foo(i32 signext 2) #0 187 %and5 = and i32 %call4, 16 188 %or6 = or i32 %or3, %and5 189 %call7 = tail call signext i32 @foo(i32 signext 1) #0 190 %and8 = and i32 %call7, 32 191 %or9 = or i32 %or6, %and8 192 %call10 = tail call signext i32 @foo(i32 signext 0) #0 193 %and11 = and i32 %call10, 64 194 %or12 = or i32 %or9, %and11 195 %call13 = tail call signext i32 @foo(i32 signext 4) #0 196 %and14 = and i32 %call13, 128 197 %or15 = or i32 %or12, %and14 198 %shl = shl i32 %or15, 10 199 ret i32 %shl 200 201 ; CHECK-LABEL: @tar2 202 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) 203 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) 204 ; CHECK: tail call signext i32 @foo(i32 signext 2) 205 ; CHECK: tail call signext i32 @foo(i32 signext 1) 206 ; CHECK: tail call signext i32 @foo(i32 signext 0) 207 ; CHECK: tail call signext i32 @foo(i32 signext 4) 208 ; CHECK: ret i32 209 } 210 211 ; Function Attrs: nounwind readnone 212 define signext i32 @tar3(i32 signext %x) #0 { 213 entry: 214 %call = tail call signext i32 @foo(i32 signext 5) #0 215 %and = and i32 %call, 33554432 216 %or = or i32 %and, %x 217 %call1 = tail call signext i32 @foo(i32 signext 3) #0 218 %and2 = and i32 %call1, 67108864 219 %or3 = or i32 %or, %and2 220 %call4 = tail call signext i32 @foo(i32 signext 2) #0 221 %and5 = and i32 %call4, 16 222 %or6 = or i32 %or3, %and5 223 %call7 = tail call signext i32 @foo(i32 signext 1) #0 224 %and8 = and i32 %call7, 32 225 %or9 = or i32 %or6, %and8 226 %call10 = tail call signext i32 @foo(i32 signext 0) #0 227 %and11 = and i32 %call10, 64 228 %or12 = or i32 %or9, %and11 229 %call13 = tail call signext i32 @foo(i32 signext 4) #0 230 %and14 = and i32 %call13, 128 231 %or15 = or i32 %or12, %and14 232 %add = add i32 %or15, 5 233 %shl = shl i32 %add, 10 234 ret i32 %shl 235 236 ; CHECK-LABEL: @tar3 237 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) 238 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) 239 ; CHECK: tail call signext i32 @foo(i32 signext 2) 240 ; CHECK: tail call signext i32 @foo(i32 signext 1) 241 ; CHECK: tail call signext i32 @foo(i32 signext 0) 242 ; CHECK: tail call signext i32 @foo(i32 signext 4) 243 ; CHECK: ret i32 244 } 245 246 ; Function Attrs: nounwind readnone 247 define signext i32 @tar4(i32 signext %x) #0 { 248 entry: 249 %call = tail call signext i32 @foo(i32 signext 5) #0 250 %and = and i32 %call, 33554432 251 %or = or i32 %and, %x 252 %call1 = tail call signext i32 @foo(i32 signext 3) #0 253 %and2 = and i32 %call1, 67108864 254 %or3 = or i32 %or, %and2 255 %call4 = tail call signext i32 @foo(i32 signext 2) #0 256 %and5 = and i32 %call4, 16 257 %or6 = or i32 %or3, %and5 258 %call7 = tail call signext i32 @foo(i32 signext 1) #0 259 %and8 = and i32 %call7, 32 260 %or9 = or i32 %or6, %and8 261 %call10 = tail call signext i32 @foo(i32 signext 0) #0 262 %and11 = and i32 %call10, 64 263 %or12 = or i32 %or9, %and11 264 %call13 = tail call signext i32 @foo(i32 signext 4) #0 265 %and14 = and i32 %call13, 128 266 %or15 = or i32 %or12, %and14 267 %sub = sub i32 %or15, 5 268 %shl = shl i32 %sub, 10 269 ret i32 %shl 270 271 ; CHECK-LABEL: @tar4 272 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) 273 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) 274 ; CHECK: tail call signext i32 @foo(i32 signext 2) 275 ; CHECK: tail call signext i32 @foo(i32 signext 1) 276 ; CHECK: tail call signext i32 @foo(i32 signext 0) 277 ; CHECK: tail call signext i32 @foo(i32 signext 4) 278 ; CHECK: ret i32 279 } 280 281 ; Function Attrs: nounwind readnone 282 define signext i32 @tar5(i32 signext %x) #0 { 283 entry: 284 %call = tail call signext i32 @foo(i32 signext 5) #0 285 %and = and i32 %call, 33554432 286 %or = or i32 %and, %x 287 %call1 = tail call signext i32 @foo(i32 signext 3) #0 288 %and2 = and i32 %call1, 67108864 289 %or3 = or i32 %or, %and2 290 %call4 = tail call signext i32 @foo(i32 signext 2) #0 291 %and5 = and i32 %call4, 16 292 %or6 = or i32 %or3, %and5 293 %call7 = tail call signext i32 @foo(i32 signext 1) #0 294 %and8 = and i32 %call7, 32 295 %or9 = or i32 %or6, %and8 296 %call10 = tail call signext i32 @foo(i32 signext 0) #0 297 %and11 = and i32 %call10, 64 298 %or12 = or i32 %or9, %and11 299 %call13 = tail call signext i32 @foo(i32 signext 4) #0 300 %and14 = and i32 %call13, 128 301 %or15 = or i32 %or12, %and14 302 %xor = xor i32 %or15, 5 303 %shl = shl i32 %xor, 10 304 ret i32 %shl 305 306 ; CHECK-LABEL: @tar5 307 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) 308 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) 309 ; CHECK: tail call signext i32 @foo(i32 signext 2) 310 ; CHECK: tail call signext i32 @foo(i32 signext 1) 311 ; CHECK: tail call signext i32 @foo(i32 signext 0) 312 ; CHECK: tail call signext i32 @foo(i32 signext 4) 313 ; CHECK: ret i32 314 } 315 316 ; Function Attrs: nounwind readnone 317 define signext i32 @tar7(i32 signext %x, i1 %b) #0 { 318 entry: 319 %call = tail call signext i32 @foo(i32 signext 5) #0 320 %and = and i32 %call, 33554432 321 %or = or i32 %and, %x 322 %call1 = tail call signext i32 @foo(i32 signext 3) #0 323 %and2 = and i32 %call1, 67108864 324 %or3 = or i32 %or, %and2 325 %call4 = tail call signext i32 @foo(i32 signext 2) #0 326 %and5 = and i32 %call4, 16 327 %or6 = or i32 %or3, %and5 328 %call7 = tail call signext i32 @foo(i32 signext 1) #0 329 %and8 = and i32 %call7, 32 330 %or9 = or i32 %or6, %and8 331 %call10 = tail call signext i32 @foo(i32 signext 0) #0 332 %and11 = and i32 %call10, 64 333 %or12 = or i32 %or9, %and11 334 %call13 = tail call signext i32 @foo(i32 signext 4) #0 335 %and14 = and i32 %call13, 128 336 %or15 = or i32 %or12, %and14 337 %v = select i1 %b, i32 %or15, i32 5 338 %shl = shl i32 %v, 10 339 ret i32 %shl 340 341 ; CHECK-LABEL: @tar7 342 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) 343 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) 344 ; CHECK: tail call signext i32 @foo(i32 signext 2) 345 ; CHECK: tail call signext i32 @foo(i32 signext 1) 346 ; CHECK: tail call signext i32 @foo(i32 signext 0) 347 ; CHECK: tail call signext i32 @foo(i32 signext 4) 348 ; CHECK: ret i32 349 } 350 351 ; Function Attrs: nounwind readnone 352 define signext i16 @tar8(i32 signext %x) #0 { 353 entry: 354 %call = tail call signext i32 @foo(i32 signext 5) #0 355 %and = and i32 %call, 33554432 356 %or = or i32 %and, %x 357 %call1 = tail call signext i32 @foo(i32 signext 3) #0 358 %and2 = and i32 %call1, 67108864 359 %or3 = or i32 %or, %and2 360 %call4 = tail call signext i32 @foo(i32 signext 2) #0 361 %and5 = and i32 %call4, 16 362 %or6 = or i32 %or3, %and5 363 %call7 = tail call signext i32 @foo(i32 signext 1) #0 364 %and8 = and i32 %call7, 32 365 %or9 = or i32 %or6, %and8 366 %call10 = tail call signext i32 @foo(i32 signext 0) #0 367 %and11 = and i32 %call10, 64 368 %or12 = or i32 %or9, %and11 369 %call13 = tail call signext i32 @foo(i32 signext 4) #0 370 %and14 = and i32 %call13, 128 371 %or15 = or i32 %or12, %and14 372 %tr = trunc i32 %or15 to i16 373 ret i16 %tr 374 375 ; CHECK-LABEL: @tar8 376 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) 377 ; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) 378 ; CHECK: tail call signext i32 @foo(i32 signext 2) 379 ; CHECK: tail call signext i32 @foo(i32 signext 1) 380 ; CHECK: tail call signext i32 @foo(i32 signext 0) 381 ; CHECK: tail call signext i32 @foo(i32 signext 4) 382 ; CHECK: ret i16 383 } 384 385 ; DEBUGIFY-LABEL: @tar9 386 define signext i16 @tar9(i32 signext %x) #0 { 387 entry: 388 %call = tail call signext i32 @foo(i32 signext 5) #0 389 %and = and i32 %call, 33554432 390 ; DEBUGIFY: call void @llvm.dbg.value(metadata i32 %call, metadata {{.*}}, metadata !DIExpression(DW_OP_constu, 33554432, DW_OP_and, DW_OP_stack_value)) 391 %cast = trunc i32 %call to i16 392 ret i16 %cast 393 } 394 395 attributes #0 = { nounwind readnone } 396 attributes #1 = { nounwind } 397 398