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 4target datalayout = "E-m:e-i64:64-n32:64" 5target triple = "powerpc64-unknown-linux-gnu" 6 7; Function Attrs: nounwind readnone 8define signext i32 @bar(i32 signext %x) #0 { 9entry: 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 52declare signext i32 @foo(i32 signext) #0 53 54; Function Attrs: nounwind readnone 55define signext i32 @far(i32 signext %x) #1 { 56entry: 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 99declare signext i32 @goo(i32 signext) #1 100 101; Function Attrs: nounwind readnone 102define signext i32 @tar1(i32 signext %x) #0 { 103entry: 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 137declare i32 @llvm.bswap.i32(i32) #0 138 139; Function Attrs: nounwind readnone 140define signext i32 @tim(i32 signext %x) #0 { 141entry: 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 175declare i32 @llvm.bitreverse.i32(i32) #0 176 177; Function Attrs: nounwind readnone 178define signext i32 @tar2(i32 signext %x) #0 { 179entry: 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 212define signext i32 @tar3(i32 signext %x) #0 { 213entry: 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 247define signext i32 @tar4(i32 signext %x) #0 { 248entry: 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 282define signext i32 @tar5(i32 signext %x) #0 { 283entry: 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 317define signext i32 @tar7(i32 signext %x, i1 %b) #0 { 318entry: 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 352define signext i16 @tar8(i32 signext %x) #0 { 353entry: 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 386define signext i16 @tar9(i32 signext %x) #0 { 387entry: 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 395attributes #0 = { nounwind readnone } 396attributes #1 = { nounwind } 397 398