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