1; RUN: opt -S -bdce -instsimplify < %s | FileCheck %s 2; RUN: opt -S -instsimplify < %s | FileCheck %s -check-prefix=CHECK-IO 3target datalayout = "E-m:e-i64:64-n32:64" 4target triple = "powerpc64-unknown-linux-gnu" 5 6; Function Attrs: nounwind readnone 7define signext i32 @bar(i32 signext %x) #0 { 8entry: 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 51declare signext i32 @foo(i32 signext) #0 52 53; Function Attrs: nounwind readnone 54define signext i32 @far(i32 signext %x) #1 { 55entry: 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 98declare signext i32 @goo(i32 signext) #1 99 100; Function Attrs: nounwind readnone 101define signext i32 @tar1(i32 signext %x) #0 { 102entry: 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 136declare i32 @llvm.bswap.i32(i32) #0 137 138; Function Attrs: nounwind readnone 139define signext i32 @tim(i32 signext %x) #0 { 140entry: 141 %call = tail call signext i32 @foo(i32 signext 5) #0 142 %and = and i32 %call, 536870912 143 %or = or i32 %and, %x 144 %call1 = tail call signext i32 @foo(i32 signext 3) #0 145 %and2 = and i32 %call1, 1073741824 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 %bs = tail call i32 @llvm.bitreverse.i32(i32 %or15) #0 160 %shr = ashr i32 %bs, 4 161 ret i32 %shr 162 163; CHECK-LABEL: @tim 164; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) 165; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) 166; CHECK: tail call signext i32 @foo(i32 signext 2) 167; CHECK: tail call signext i32 @foo(i32 signext 1) 168; CHECK: tail call signext i32 @foo(i32 signext 0) 169; CHECK: tail call signext i32 @foo(i32 signext 4) 170; CHECK: ret i32 171} 172 173; Function Attrs: nounwind readnone 174declare i32 @llvm.bitreverse.i32(i32) #0 175 176; Function Attrs: nounwind readnone 177define signext i32 @tar2(i32 signext %x) #0 { 178entry: 179 %call = tail call signext i32 @foo(i32 signext 5) #0 180 %and = and i32 %call, 33554432 181 %or = or i32 %and, %x 182 %call1 = tail call signext i32 @foo(i32 signext 3) #0 183 %and2 = and i32 %call1, 67108864 184 %or3 = or i32 %or, %and2 185 %call4 = tail call signext i32 @foo(i32 signext 2) #0 186 %and5 = and i32 %call4, 16 187 %or6 = or i32 %or3, %and5 188 %call7 = tail call signext i32 @foo(i32 signext 1) #0 189 %and8 = and i32 %call7, 32 190 %or9 = or i32 %or6, %and8 191 %call10 = tail call signext i32 @foo(i32 signext 0) #0 192 %and11 = and i32 %call10, 64 193 %or12 = or i32 %or9, %and11 194 %call13 = tail call signext i32 @foo(i32 signext 4) #0 195 %and14 = and i32 %call13, 128 196 %or15 = or i32 %or12, %and14 197 %shl = shl i32 %or15, 10 198 ret i32 %shl 199 200; CHECK-LABEL: @tar2 201; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) 202; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) 203; CHECK: tail call signext i32 @foo(i32 signext 2) 204; CHECK: tail call signext i32 @foo(i32 signext 1) 205; CHECK: tail call signext i32 @foo(i32 signext 0) 206; CHECK: tail call signext i32 @foo(i32 signext 4) 207; CHECK: ret i32 208} 209 210; Function Attrs: nounwind readnone 211define signext i32 @tar3(i32 signext %x) #0 { 212entry: 213 %call = tail call signext i32 @foo(i32 signext 5) #0 214 %and = and i32 %call, 33554432 215 %or = or i32 %and, %x 216 %call1 = tail call signext i32 @foo(i32 signext 3) #0 217 %and2 = and i32 %call1, 67108864 218 %or3 = or i32 %or, %and2 219 %call4 = tail call signext i32 @foo(i32 signext 2) #0 220 %and5 = and i32 %call4, 16 221 %or6 = or i32 %or3, %and5 222 %call7 = tail call signext i32 @foo(i32 signext 1) #0 223 %and8 = and i32 %call7, 32 224 %or9 = or i32 %or6, %and8 225 %call10 = tail call signext i32 @foo(i32 signext 0) #0 226 %and11 = and i32 %call10, 64 227 %or12 = or i32 %or9, %and11 228 %call13 = tail call signext i32 @foo(i32 signext 4) #0 229 %and14 = and i32 %call13, 128 230 %or15 = or i32 %or12, %and14 231 %add = add i32 %or15, 5 232 %shl = shl i32 %add, 10 233 ret i32 %shl 234 235; CHECK-LABEL: @tar3 236; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) 237; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) 238; CHECK: tail call signext i32 @foo(i32 signext 2) 239; CHECK: tail call signext i32 @foo(i32 signext 1) 240; CHECK: tail call signext i32 @foo(i32 signext 0) 241; CHECK: tail call signext i32 @foo(i32 signext 4) 242; CHECK: ret i32 243} 244 245; Function Attrs: nounwind readnone 246define signext i32 @tar4(i32 signext %x) #0 { 247entry: 248 %call = tail call signext i32 @foo(i32 signext 5) #0 249 %and = and i32 %call, 33554432 250 %or = or i32 %and, %x 251 %call1 = tail call signext i32 @foo(i32 signext 3) #0 252 %and2 = and i32 %call1, 67108864 253 %or3 = or i32 %or, %and2 254 %call4 = tail call signext i32 @foo(i32 signext 2) #0 255 %and5 = and i32 %call4, 16 256 %or6 = or i32 %or3, %and5 257 %call7 = tail call signext i32 @foo(i32 signext 1) #0 258 %and8 = and i32 %call7, 32 259 %or9 = or i32 %or6, %and8 260 %call10 = tail call signext i32 @foo(i32 signext 0) #0 261 %and11 = and i32 %call10, 64 262 %or12 = or i32 %or9, %and11 263 %call13 = tail call signext i32 @foo(i32 signext 4) #0 264 %and14 = and i32 %call13, 128 265 %or15 = or i32 %or12, %and14 266 %sub = sub i32 %or15, 5 267 %shl = shl i32 %sub, 10 268 ret i32 %shl 269 270; CHECK-LABEL: @tar4 271; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) 272; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) 273; CHECK: tail call signext i32 @foo(i32 signext 2) 274; CHECK: tail call signext i32 @foo(i32 signext 1) 275; CHECK: tail call signext i32 @foo(i32 signext 0) 276; CHECK: tail call signext i32 @foo(i32 signext 4) 277; CHECK: ret i32 278} 279 280; Function Attrs: nounwind readnone 281define signext i32 @tar5(i32 signext %x) #0 { 282entry: 283 %call = tail call signext i32 @foo(i32 signext 5) #0 284 %and = and i32 %call, 33554432 285 %or = or i32 %and, %x 286 %call1 = tail call signext i32 @foo(i32 signext 3) #0 287 %and2 = and i32 %call1, 67108864 288 %or3 = or i32 %or, %and2 289 %call4 = tail call signext i32 @foo(i32 signext 2) #0 290 %and5 = and i32 %call4, 16 291 %or6 = or i32 %or3, %and5 292 %call7 = tail call signext i32 @foo(i32 signext 1) #0 293 %and8 = and i32 %call7, 32 294 %or9 = or i32 %or6, %and8 295 %call10 = tail call signext i32 @foo(i32 signext 0) #0 296 %and11 = and i32 %call10, 64 297 %or12 = or i32 %or9, %and11 298 %call13 = tail call signext i32 @foo(i32 signext 4) #0 299 %and14 = and i32 %call13, 128 300 %or15 = or i32 %or12, %and14 301 %xor = xor i32 %or15, 5 302 %shl = shl i32 %xor, 10 303 ret i32 %shl 304 305; CHECK-LABEL: @tar5 306; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) 307; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) 308; CHECK: tail call signext i32 @foo(i32 signext 2) 309; CHECK: tail call signext i32 @foo(i32 signext 1) 310; CHECK: tail call signext i32 @foo(i32 signext 0) 311; CHECK: tail call signext i32 @foo(i32 signext 4) 312; CHECK: ret i32 313} 314 315; Function Attrs: nounwind readnone 316define signext i32 @tar7(i32 signext %x, i1 %b) #0 { 317entry: 318 %call = tail call signext i32 @foo(i32 signext 5) #0 319 %and = and i32 %call, 33554432 320 %or = or i32 %and, %x 321 %call1 = tail call signext i32 @foo(i32 signext 3) #0 322 %and2 = and i32 %call1, 67108864 323 %or3 = or i32 %or, %and2 324 %call4 = tail call signext i32 @foo(i32 signext 2) #0 325 %and5 = and i32 %call4, 16 326 %or6 = or i32 %or3, %and5 327 %call7 = tail call signext i32 @foo(i32 signext 1) #0 328 %and8 = and i32 %call7, 32 329 %or9 = or i32 %or6, %and8 330 %call10 = tail call signext i32 @foo(i32 signext 0) #0 331 %and11 = and i32 %call10, 64 332 %or12 = or i32 %or9, %and11 333 %call13 = tail call signext i32 @foo(i32 signext 4) #0 334 %and14 = and i32 %call13, 128 335 %or15 = or i32 %or12, %and14 336 %v = select i1 %b, i32 %or15, i32 5 337 %shl = shl i32 %v, 10 338 ret i32 %shl 339 340; CHECK-LABEL: @tar7 341; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) 342; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) 343; CHECK: tail call signext i32 @foo(i32 signext 2) 344; CHECK: tail call signext i32 @foo(i32 signext 1) 345; CHECK: tail call signext i32 @foo(i32 signext 0) 346; CHECK: tail call signext i32 @foo(i32 signext 4) 347; CHECK: ret i32 348} 349 350; Function Attrs: nounwind readnone 351define signext i16 @tar8(i32 signext %x) #0 { 352entry: 353 %call = tail call signext i32 @foo(i32 signext 5) #0 354 %and = and i32 %call, 33554432 355 %or = or i32 %and, %x 356 %call1 = tail call signext i32 @foo(i32 signext 3) #0 357 %and2 = and i32 %call1, 67108864 358 %or3 = or i32 %or, %and2 359 %call4 = tail call signext i32 @foo(i32 signext 2) #0 360 %and5 = and i32 %call4, 16 361 %or6 = or i32 %or3, %and5 362 %call7 = tail call signext i32 @foo(i32 signext 1) #0 363 %and8 = and i32 %call7, 32 364 %or9 = or i32 %or6, %and8 365 %call10 = tail call signext i32 @foo(i32 signext 0) #0 366 %and11 = and i32 %call10, 64 367 %or12 = or i32 %or9, %and11 368 %call13 = tail call signext i32 @foo(i32 signext 4) #0 369 %and14 = and i32 %call13, 128 370 %or15 = or i32 %or12, %and14 371 %tr = trunc i32 %or15 to i16 372 ret i16 %tr 373 374; CHECK-LABEL: @tar8 375; CHECK-NOT: tail call signext i32 @foo(i32 signext 5) 376; CHECK-NOT: tail call signext i32 @foo(i32 signext 3) 377; CHECK: tail call signext i32 @foo(i32 signext 2) 378; CHECK: tail call signext i32 @foo(i32 signext 1) 379; CHECK: tail call signext i32 @foo(i32 signext 0) 380; CHECK: tail call signext i32 @foo(i32 signext 4) 381; CHECK: ret i16 382} 383 384attributes #0 = { nounwind readnone } 385attributes #1 = { nounwind } 386 387